下面这些都是我在工作中用到的函数,现在整理下。

1.判断是否是一个数组

function _is_array($value){
if (is_array($value)) {
return true;
} else {
if(is_object($value) && is_array(json_decode(json_encode($value),true))){
return true;
}
return (is_object($value) && $value instanceof \Traversable);//实现这个接口对象可以foreach
}
}

 2.比较数组是否相等

function arraysEqual($arr1, $arr2){
if(count($arr1) != count($arr2)){
return false;
}else{
$arrStr1 = serialize($arr1);
$arrStr2 = serialize($arr2);
if( strcmp($arrStr1, $arrStr2)==0 ){//strcmp区分大小写 strcasecmp二进制安全比较字符串(不区分大小写)
return true;
}else{
return false;
}
}
}

测试

$compare_arr1 = [1,2,3,['one'=>'1','2']];
$compare_arr2 = [1,2,3,['one'=>'1','2']];
var_dump(arraysEqual($compare_arr1,$compare_arr2));

3.找到数组中最长的字符串

function get_longstr($array){
$strlen_arr = array_combine($array, array_map('strlen', $array));
return array_keys($strlen_arr, max($strlen_arr));
}

$str_arr = ['aaagggggggggggggg','abngfdgfdgdf','bbbb','ccccc','121',666668];

print_r(get_longstr($str_arr));

输出

Array ( [0] => aaagggggggggggggg )

4.找到多维数组中最长的字符串 

$count_arr= [];
$arr = array_walk_recursive($str_arr,function ($arr) use (&$count_arr){ //主要利用函数array_walk_recursive()递归数组
$count_arr = $count_arr + [$arr=>strlen($arr)];
});
$str_arr = ['aaa','33','bb','ccccc','121','666668',['kkkkkk','key'=>'ddddddddffff','ddd2222222sk',[5555,'kkkkksskkkkkkkkkk']]];
print_r(array_keys($count_arr, max($count_arr)));

输出

Array ( [0] => kkkkksskkkkkkkkkk )

 5.过滤数组中不是数组的元素

$array_filter_arr = function(array $data, callable $f){
return array_filter($data, function() use(&$f) {
return call_user_func_array($f, func_get_args());
});
};
$arr = [22,55,['ddd','lkk'],[1,[2]]];
print_r($array_filter_arr($arr,'is_array'));

输出

Array ( [2] => Array ( [0] => ddd [1] => lkk ) [3] => Array ( [0] => 1 [1] => Array ( [0] => 2 ) ) )

6.清空数组

function _destruct_one($object){
if (_is_array($object)) {
$length = count($object);
while($length--){
array_splice($object,$length,1);
}
}
return $object;
}
var_dump(_destruct_one([1,2,'d','key'=>'k'])); //array(0) {}

上面函数是清空整个数组内容,那么有时候需要清空数组中的空值或者false等值,我们需要重新写个函数。

下面这个函数可以递归过滤多维数组中 空白字符,负值,false,null

/*$arr   要删除的数组
* $trim 是否对字符trim操作
* $unsetEmptyArr 是否删除空的子数组
*/
function _arrRemoveEmpty(&$arr,$trim = true,$unsetEmptyArr=false){
foreach ($arr as $key => $value) {
if(is_array($value)) {
_arrRemoveEmpty($arr[$key]);
}else{
$value = trim($value);
if ($value == '') {
unset($arr[$key]);
}elseif ($trim){
$arr[$key] = $value;
}
}
}
if(is_bool($unsetEmptyArr) && $unsetEmptyArr){
$arr = array_filter($arr);
}
return $arr;
}

$entry = array(
  0 => 'foo' ,
  1 => false ,
  2 => - 1 ,
  3 => null ,
  4 => '',
  ['aa'=>'',false,true,'dd'],
  [false]
);
print_r(_arrRemoveEmpty($entry,1,true));

Array
(
[0] => foo
[2] => -1
[5] => Array
(
[1] => 1
[2] => dd
) )

这里主要利用了php内置函数array_filter()的功能还有递归。

7.数组中字段替换。

我们替换数组的值会用php自带函数array_replace() ,手册解释如下

    array_replace() 函数使用后面数组元素的值替换第一个 array 数组的值。如果一个键存在于第一个数组同时也存在于第二个数组,它的值将被第二个数组中的值替换。如果一个键存在于第二个数组,但是不存在于第一个数组,则会在第一个数组中创建这个元素。如果一个键仅存在于第一个数组,它将保持不变。如果传递了多个替换数组,它们将被按顺序依次处理,后面的数组将覆盖之前的值。

$arr1 = ['id' => 10, 'name' => 'jack', 'sex' => 'man'];
$arr2 = ['id' => 12, 'name' => 'tom', 'sex' => 'female','height'=>'162cm'];
$arr = array_replace($arr1,$arr2);
print_r($arr);
Array
(
[id] => 12
[name] => tom
[sex] => female
[height] => 162cm
)

结果中$arr1里没有键值'height'=>'162cm'也被添加进去了,如果开发中不想新增,只想替换有的。

下面这个函数可以实现该功能。

function _arrOverWrite($array, $cover_array){
$key_intersect_arr = array_intersect_key($cover_array, $array);//返回$cover_array出现在$array的键名的值
foreach ($key_intersect_arr as $key => $value) {
$array[$key] = $value;//替换赋值
}
if (func_num_args() > 2) {
foreach (array_slice(func_get_args(), 2) as $cover_array) {
foreach (array_intersect_key($cover_array, $array) as $key => $value) {
$array[$key] = $value;
}
}
}
return $array;
}
$arr1 = ['id' => '111', 'name' => 'jack', 'sex' => 'man','hobby'=>'book'];
$arr2 = ['id' => '222', 'name' => 'tom', 'sex' => 'female','height'=>'162cm'];
$arr3 = ['id' => '333', 'name' => 'kate', 'sex' => 'female','height'=>'162cm'];
$arr = _arrOverWrite($arr1,$arr2,$arr3);
print_r($arr);

打印出

Array
(
[id] => 333
[name] => kate
[sex] => female
[hobby] => book
)

 8.判断数组是否是关联数组

function _is_assoc(array $array){
$keys_arr = array_keys($array);
return array_keys($keys_arr) !== $keys_arr;
} $arr1 = ['one'=>'aa','two'=>'tt'];
var_dump((_is_assoc(['one'=>'aa','two'=>'tt'])));
bool(true)

 9.快速检查数组中是否存在某个值

这个函数手册里有,工作中直接用这个

function _fast_in_array($needle, array $haystack, $strict = false){
$c = count($haystack);
if($strict !== true){
for($i = 0; $i < $c; $i++){
if($haystack[$i] == $needle){
return true;
}
}
}else{
for($i = 0; $i < $c; $i++){
if($haystack[$i] === $needle){
return true;
}
}
}
return false;
} var_dump(_fast_in_array('aa',['aa','bb','cc'])); //true

或者下面这个方法

function inArray($item, $array) {
$flipArray = array_flip($array);
return isset($flipArray[$item]);
}

10.合并多个数组

/*
* 作用 递归合并两个或多个数组。关联数组中的值用相同的键覆盖以前的值。索引数组中的值,被追加,但只有在结果中不存在时才追加。
* $array1 arr
* $array2 arr
* return merged_arr
*/
function _recursively_array_merge($array1, $array2){
if (_is_assoc($array2)) {//关联数组
foreach ($array2 as $key => $value) {
if (is_array($value) && isset($array1[$key]) && is_array($array1[$key])){
$array1[$key] = _recursively_array_merge($array1[$key], $value);
}else{
$array1[$key] = $value;
}
}
}else{//索引数组
foreach ($array2 as $value){
if (!in_array($value, $array1, true)){
$array1[] = $value;
}
}
}
if (func_num_args() > 2){
foreach (array_slice(func_get_args(), 2) as $array2){
if (_is_assoc($array2)){
foreach ($array2 as $key => $value){
if (is_array($value) && isset($array1[$key]) && is_array($array1[$key])){
$array1[$key] = _recursively_array_merge($array1[$key], $value);
}else{
$array1[$key] = $value;
}
}
}else{
foreach ($array2 as $value){
if (!in_array($value, $array1, true)){
$array1[] = $value;
}
}
}
}
}
return $array1;
}

demo

$arr1 = ['one'=>'aaa','two'=>'bbb',['kk'=>'kk_val111']];
$arr2 = ['one'=>'aaa','two'=>'bbbttt',1,['kk'=>'kk_val',5,'abc'=>'ww']];
print_r(_recursively_array_merge($arr1,$arr2));

Array ( [one] => aaa [two] => bbbttt [0] => 1 [1] => Array ( [kk] => kk_val [0] => 5 [abc] => ww ) )

11.多维数组递归成一维数组

function _arr_flatten($array){
$isAssoc = _is_assoc($array);
$flat_arr = [];
foreach ($array as $key => $value) {
if (is_array($value)) {
$flat_arr = array_merge($flat_arr, _arr_flatten($value));
}else{
if ($isAssoc){
$flat_arr[$key] = $value;
}else{
$flat_arr[] = $value;
}
}
}
return $flat_arr;
}

demo

$arr = ['foo'=>[
'bar'=>'bar_value',
'bar_two'=>'bar_two_value',
'bar_keys'=>[
'a'=>'aaa',
'b'=>'bbb',
'c'=>'ccc',
]
],1,[1,2],'top'=>[
'top_bar1'=>'top_bar_value1',
'top_bar2'=>'top_bar_value2',
]]; print_r(_arr_flatten($arr));

Array (

  [bar] => bar_value

  [bar_two] => bar_two_value

  [a] => aaa

  [b] => bbb

  [c] => ccc

  [0] => 1

  [1] => 1

  [2] => 2

  [top_bar1] => top_bar_value1

  [top_bar2] => top_bar_value2

)

12.通过自定义分隔符设置路径获取数组中的值

 

比如有个多维数组

$arr = ['foo'=>[
'bar'=>'bar_value',
'bar_two'=>'bar_two_value',
'bar_keys'=>[
'a'=>'aaa',
'b'=>'bbb',
'c'=>'ccc',
]
],1,[1,2],'top'=>[
'top_bar1'=>'top_bar_value1',
'top_bar2'=>'top_bar_value2',
]];
我想通过foo.bar_keys 这样的方式获取数组 $arr 在键为foo里面键为bar_keys的值
/*
* $array arr
* $path 自定义路径
* $default 默认返回值
* $delimiter 分隔符
*/
function _path($array, $path, $default = null, $delimiter = null){
if (!_is_array($array)) {
return $default;
}
if (is_array($path)) {
$keys = $path;
}else {
if (array_key_exists($path,$array)) {
return $array[$path];
}
if ($delimiter === null) {
$delimiter = '.';
}
$path = ltrim($path, "{$delimiter}");
// 删除右边的delimiters, 空格,通配符
$path = rtrim($path, "{$delimiter} *");//包含空格
$keys = explode($delimiter, $path);
}
do {
$key = array_shift($keys);//将数组开头的单元移出数组 最终清空数组
if (ctype_digit($key)) {//ctype_digit()做纯数字检测
$key = (int) $key;
}
if (isset($array[$key])) {
if ($keys) {
if (_is_array($array[$key])) {
$array = $array[$key];//给$array在赋值
}else {
break;
}
} else {
return $array[$key];
}
} elseif ($key === '*') {
$values = [];
foreach ($array as $arr) {
if ($value = _path($arr, implode('.', $keys))) {
$values[] = $value;
}
}
if ($values) {
return $values;
} else {
break;
}
} else {
break;
}
}while ($keys);
return $default;
}
print_r(_path($arr,'foo.bar_keys')) ;

打印出

Array
(
[a] => aaa
[b] => bbb
[c] => ccc
) 也可以用*号,获取键top下所有的值
print_r(_path($arr,'top.*')) ;

结果是

Array
(
[top_bar1] => top_bar_value1
[top_bar2] => top_bar_value2
)
13.添加多个键值对到一个数组前面
$arr = ['one'=>'one_value','two'=>'two_value'];
array_unshift ( $arr , ['three_value'=>'three'] );
array_unshift ( $arr , ['four'] );
print_r ( $arr );

结果是

Array
(
[0] => Array
(
[0] => four
) [1] => Array
(
[three_value] => three
) [one] => one_value
[two] => two_value
) 可是这不是我想要的结果
function _arr_prepend($array, $append_arr){
if(!empty($append_arr)){
while (list( $key , $val ) = each ( $append_arr )) {
if(is_numeric($key)) {
array_unshift($array, $val);
}else {
$array = [$key => $val] + $array;
}
}
}
return $array;
} $arr = ['one'=>'one_value','two'=>'two_value'];
print_r(_arr_prepend($arr,['four','three_value'=>'three']));

结果

Array
(
[three_value] => three
[0] => four
[one] => one_value
[two] => two_value
)

14.统计数组的深度

function _arraylevel($arr,&$result=0){//利用引用做参数  也可以用静态变量
if(is_array($arr)){
$result++;
foreach ($arr as $v){
_arraylevel($v,$result);
}
}
return $result;
} $str_arr = ['aaa',['bb',['cc',['dd']]]];
echo _arraylevel($str_arr); //4

15.获取字符串某标识符后面字符

function str_last_after($subject, $search)
{
if ($search == '') {
return $subject;
} $pos = strripos($subject, $search); if ($pos === false) {
return $subject;
} return substr($subject, $pos + strlen($search));
}

 16.递归数组每个成员应用函数

function array_recursive(&$input, $funcname, $userdata = "")
{
if (!is_callable($funcname)) {
return false;
} if (!is_array($input)) {
return false;
} foreach ($input as $key => $value) {
if (is_array($input[$key])) {
array_recursive($input[$key], $funcname, $userdata);
} else {
$saved_value = $value;
if (!empty($userdata)) {
$funcname($value, $key, $userdata);
} else {
$funcname($value, $key);
} if ($value != $saved_value) {
$input[$key] = $value;
}
}
}
return true;
}

17.根据键值给二维数组排序(模仿sql语句排序)

function arrayOrderBy(array &$arr, $order = null) {
if (is_null($order)) {
return $arr;
}
$orders = explode(',', $order);
usort($arr, function($a, $b) use($orders) {
$result = array();
foreach ($orders as $value) {
list($field, $sort) = array_map('trim', explode(' ', trim($value)));
if (!(isset($a[$field]) && isset($b[$field]))) {
continue;
}
if (strcasecmp($sort, 'desc') === 0) {
$tmp = $a;
$a = $b;
$b = $tmp;
}
if (is_numeric($a[$field]) && is_numeric($b[$field]) ) {
$result[] = $a[$field] - $b[$field];
} else {
$result[] = strcmp($a[$field], $b[$field]);
}
}
return implode('', $result);
});
return $arr;
}

demo

$arr = array(
array('id' => 1, 'age' => 1, 'sex' => 6, 'name' => 'a'),
array('id' => 2, 'age' => 3, 'sex' => 1, 'name' => 'c'),
array('id' => 3, 'age' => 3, 'sex' => 1, 'name' => 'b'),
array('id' => 4, 'age' => 2, 'sex' => 1, 'name' => 'd'),
);
print_r(arrayOrderBy($arr, 'age asc,sex asc,name desc'));

上面函数是利用usort回调函数去处理数组的,那么也可以利用该函数做些别的,比如对比日期大小

usort($monthArr, function ($time1, $time2) {
$strtotimeLeft = strtotime($time1);
$strtotimeRight = strtotime($time2);
if ($strtotimeLeft == $strtotimeRight) {
return 0;
}
return ($strtotimeLeft < $strtotimeRight) ? 1 : -1;
});

demo

$monthArr = array('2019-08-11','2019-09-11','2019-03-18',);
print_r($monthArr);
输出
array (
0 => '2019-09-11',
1 => '2019-08-11',
2 => '2019-03-18',
)

更新中.....

【php】php数组相关操作函数片段的更多相关文章

  1. python字符串 列表 元组 字典相关操作函数总结

    1.字符串操作函数 find 在字符串中查找子串,找到首次出现的位置,返回下标,找不到返回-1 rfind 从右边查找 join 连接字符串数组 replace 用指定内容替换指定内容,可以指定次数 ...

  2. Scala学习(三)----数组相关操作

    数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不 ...

  3. PHP基础系列(二) PHP数组相关的函数分类整理

    之前写过一篇介绍 PHP字符串函数 的博文,这里写第二篇,本文主要介绍PHP 数组相关的函数: 一.检查数组中是否存在 array_key_exists — 检查给定的键名或索引是否存在于数组中 ar ...

  4. linux新定时器:timefd及相关操作函数

    timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...

  5. (二十四)linux新定时器:timefd及相关操作函数

    timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...

  6. 快学Scala习题解答—第三章 数组相关操作

    3 数组相关操作  3.1 编写一段代码.将a设置为一个n个随机整数的数组,要求随机数介于0(包括)和n(不包括)之间  random和yield的使用 import scala.math.rando ...

  7. 关于php的ini文件相关操作函数浅析

    在小公司,特别是创业型公司,整个服务器的搭建一般也是我们 PHP 开发工程师的职责之一.其中,最主要的一项就是要配置好服务器的 php.ini 文件.一些参数会对服务器的性能产生深远的影响,而且也有些 ...

  8. PHP常用的数组相关处理函数

    [数组中常用的多种遍历方式] [for 和 foreach 略] [while() . list() .each() 组合循环遍历数组] each()函数 a. 需要一个数组作为参数 b. 返回来的也 ...

  9. js对数组的操作函数

    js数组的操作 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多, 自以为js高手的自己居然无从下手, ...

随机推荐

  1. 如何在 Linux 中查找最大的 10 个文件

    https://linux.cn/article-9495-1.html

  2. spring boot中的约定优于配置

    Spring Boot并不是一个全新的框架,而是将已有的Spring组件整合起来. Spring Boot可以说是遵循约定优于配置这个理念产生的.它的特点是简单.快速和便捷. 既然遵循约定优于配置,则 ...

  3. Azure系列2.1 —— com.microsoft.azure.storage.blob

    网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习心得做下笔记,文中不正确地方请大家指正. Azure Blob ...

  4. cordova微信支付回调App闪退

    这是cordova版本太高,不兼容这个插件所导致的.解决方案是修改$your_project/plugins/cordova-plugin-wechat/scripts/android-install ...

  5. Sublime Text3配置

    { "default_encoding": "UTF-8", "font_size": 16.0, "tab_size" ...

  6. Spirng boot maven多模块打包不踩坑

    本文参考 https://blog.csdn.net/Ser_Bad/article/details/78433340 经过实战一次通过.回话不多说,话费不多说,直接上图. 项目整体结构: 父模块: ...

  7. 【纪录】Hash about

    backup a easy implement # coding: utf-8 def add(k, v): pass def get(target): pass class LinearMap(ob ...

  8. vue 思維導圖

    vue概念:vue是一個輕量級的javascript庫:是一種漸進式的框架:vue可以實現數據視圖雙向綁定. vue基礎語法:實例化.條件.循環 vue重頭戲:動畫.組件.過濾.ajax.自定義組件. ...

  9. vs code軟件操作

    https://www.imooc.com/article/39349 https://www.html.cn/archives/8144

  10. SpringJdbc框架

    import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import JdbcUtils.Jdb ...