您的位置:首页 > 编程语言 > PHP开发

php获取多维数组某个特定键(数组下标)的所有值,具体总结下其余的方法

2013-11-12 10:30 736 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: