PHP多维数组二维数组查找、搜索、判断
- 发表于
- PHP
PHP多维数组查找指定值
PHP多维数组中是否存在某一值
Value
,写
foreach
针对特定场景耗时耗内存,探讨最优方案。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <?php $records = array( array( 'id' => 2135, 'first_name' => 'John', 'last_name' => 'Doe', 'meta' => array ( 'registered_on' => '1/1/2019', 'more_meta' => array( 'registered_on' => 'i am 3 levels deep', ) ) ), array( 'id' => 3245, 'first_name' => 'Sally', 'last_name' => 'Smith', 'meta' => array ( 'registered_on' => '6/1/2019' ) ), array( 'id' => 5342, 'first_name' => 'Jane', 'last_name' => 'Jones', 'meta' => array ( 'registered_on' => '12/1/2019' ) ), array( 'id' => 5623, 'first_name' => 'Peter', 'last_name' => 'Doe', 'meta' => array ( 'registered_on' => '1/1/2020' ) ) ); //多维数组查找 function array_column_recursive(array $haystack, $needle) { $found = []; array_walk_recursive($haystack, function($value, $key) use (&$found, $needle) { if ($key == $needle) $found[] = $value; }); return $found; } $registeredOnArray = array_column_recursive($records, 'registered_on'); var_export($registeredOnArray); /* 输出结果 array ( 0 => '1/1/2019', 1 => 'i am 3 levels deep', 2 => '6/1/2019', 3 => '12/1/2019', 4 => '1/1/2020', ) */ ?> |
或方法
自定义函数
下面的递归方法来检查多维数组中是否存在某一值。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | function deep_in_array($value, $array) { foreach($array as $item) { if(!is_array($item)) { if ($item == $value) { return true; } else { continue; } } if(in_array($value, $item)) { return true; } else if(deep_in_array($value, $item)) { return true; } } return false; } |
PHP二维数组查找指定值
利用
array_search
与
array_column
实现二维数组查找,不用自己写个循环,减少工作量。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php $userdb = array( 0 => array( 'uid' => 100, 'name' => 'Sandra Shush', 'url' => 'urlof100' ), 1 => array( 'uid' => 5465, 'name' => 'Stefanie Mcmohn', 'pic_square' => 'urlof100' ), 2 => Array( 'uid' => 40489, 'name' => 'Michael', 'pic_square' => 'urlof40489' ) ); $found_key = array_search(40489, array_column($userdb, 'uid')); /** 如果$userdb很大,建议使用一个变量,避免搜索每个元素时都调用array_column() $uid = array_column($userdb, 'uid'); $found_key = array_search(40489, $uid); */ var_dump($found_key); |
重复值过滤
上面的函数和第二个解决方法会有问题,就是仅仅返回了第一个匹配的键。如果在数组中有重复的值,而
uid
列也不唯一,要把所有的匹配结果都返回,该怎么做呢?PHP提供了这样的功能,只需改用
array_keys
函数即可:
| 1 | $keys = array_keys(array_column($userdb, 'uid'), 40489); |
返回对值
上面返回的是数组对应的键,那如果想要键和值一并关联返回,一行代码能搞定吗?可以的,修改一下就行了,使用
array_combine
函数将键和值组装起来返回:
| 1 | $keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489); |
上面是使用函数完成,当然你也可以自己写个函数
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /** * 判断字符串是否在数组中,包括二维数组--这里只能判断二维数组 * @param $str * @param $arr * @return bool */ public function array_multi_search($str,$arr){ if(in_array($str,$arr)){ return true; } foreach ($arr as $row){ if($this->array_multi_search($str,$row)){ return true; } } return false; } |
也能这样
| 1 2 3 | if(in_array(100, array_column($userdb, 'uid'))) { echo "FOUND"; } |
array_column()
返回输入数组中某个单一列的值.
| 1 | array_column($userdb, 'uid') |
它将返回如下数组:
| 1 2 3 4 5 6 | Array ( [0] => 100 [1] => 5465 [2] => 40489 ) |
然后我们使用
in_array()
函数检查一维数组中是否存在值"100"。
原文连接:PHP多维数组二维数组查找、搜索、判断 所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。