在處理php數組的時候,有一種需求特別的頻繁,如下二維數組:
$arr = array(
1=>array(
'id' => 5,
'name' => '張三'
),
2=>array(
'id' => 6,
'name' => '李四'
)
);
目的就是要取到key為name的集合,得到這個結果:
$arr2 = array(
0=>'張三',
1=>'李四'
);
這裡有幾種方法:
1:最簡單的,foreach遍曆數組:
foreach ($arr as $key => $value) {
$arr2[] = $value['name'];
}
2:代碼量稍微少一點的代碼,使用了array_map這個php方法:
$arr2 = array_map('array_shift',$arr);
意為把$arr數組的每一項值的開頭的值移出,並返回被移出的每一項值中被移出的值,注意此時新數組$arr2的鍵仍是原數組$arr的鍵
2.1:在方法2的基礎上,可以稍微開一下腦洞,如果需要擷取的是二維數組的每一項的開頭列或結尾列,也可以這樣做:
$arr2 = array_map('end',$arr);
哈哈,也是很方便的
3:還可以使用array_reduce方法,不過代碼略多,不過這個方法的想象空間(針對別的數組取值操作)還是蠻大的:
$arr2 = array_reduce($arr, create_function('$result, $v', '$result[] = $v["name"];return $result;'));
array_reduce方法用回呼函數迭代地將對數組的值進行操作,而create_function用於一個匿名方法做回調用,這個匿名方法的參數$result為上一次迭代產生的值,$v是當前的值,內部實現既為擷取到數組$arr每一項的”name”的值並push到新$result數組;
4:最後這個終極方法實在是太爽了,一個方法就搞定,而且非常靈活:
$arr2 = array_column($arr, 'name');
第二個參數為想要擷取的那一列的鍵名,是不是很方便呢,不過這個方法有個限制,就是php版本必須 >= 5.5.0,在陳舊項目中使用這個方法還是得斟酌一下哈
隨機擷取二維數組中的一個值
$arr1 = array(
'p1'=>array('ky_d'=>'福建省泉州市豐澤區華大街道1','ky_s'=>'350503005'),
'p2'=>array('ky_d'=>'福建省泉州市豐澤區華大街道2','ky_s'=>'350503006'),
'p3'=>array('ky_d'=>'福建省泉州市豐澤區華大街道3','ky_s'=>'350503007')
);
$temp = array_rand($arr1,1);
// print_r($temp);
echo $arr1[$temp]['ky_d'].':'.$arr1[$temp]['ky_s'];
擷取一維或多維陣列某個特定鍵(數組下標)的所有值 .
/*
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'));
/*
result:
Array
(
[0] => 23
[1] => 123
[2] => "asdasdgsadggsadg"
)
*/