php获取多维数组某个特定键(数组下标)的所有值,具体总结下其余的方法
1、项目中经常会用到获取多维数组某个特定键的所有值,经常的做法是循环获取,今天在网上看到一个不用循环获取的办法。
/* author: yangyu@sina.cn description: 根据某一特定键(下标)取出一维或多维数组的所有值;不用循环的理由是考虑大数组的效率,把数组序列化,然后根据序列化结构的特点提取需要的字符串 */ function array_get_by_key(array $array, $string){ if (!trim($string)) return false; preg_match_all("/"$string";w{1}:(?:d+:|)(.*?);/", serialize($array), $res); return $res[1]; } $r = array("id"=> 1, "s"=> 23, "a" => array("s" => 123, array(1, 2, "s" => "asdasdgsadggsadg"))); echo "<pre>"; print_r (array_get_by_key($r, "s"));
==============================这种方法是通过序列化结构的特点提取需要的字符串,加上正则匹配获取到结果的=======
2、下面这个方法,采用php的闭包语法。这个要在php5.3以上才可以执行
<?php $arr = array("id"=> 1, "s"=> 23, "a" => array("s" => 123, array(1, 2, "s" => "asdasdgsadggsadg"))); $result = array_filter($arr, function ($var) { $found = false; array_walk_recursive($var, function ($item, $key) use (&$found) { $found = $found || $key == "s"; }); return $found; }); var_dump($result);
3、用标准PHP类库SPL里的ArrayIterator类,ArrayIterator类和ArrayObject类,只支持遍历一维数组。与之对应的RecursiveArrayIterator支持遍历多维数组,首先用 RecursiveIteratorIterator生成一个Iterator,然后再对这个Iterator使用 RecursiveArrayIterator。贴代码:
function searchMultiArray(array $array, $search, $mode = "key") { $res = array(); foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $key => $value) { if ($search === ${${"mode"}}){ if($mode == "key"){ $res[] = $value; }else{ $res[] = $key; } } } return $res; } var_dump(searchMultiArray($arr, "s"));
4、分享一个用递归方法实现的函数
function getArray($array, $index) { if (!is_array($array)) return null; if (isset($array[$index])) return $array[$index]; foreach ($array as $item) { $return = getArray($item, $index); if (!is_null($return)) { return $return; } } return null; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。