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多维数组二维数组查找、搜索、判断
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。