php獲取多維陣列某個特定鍵(陣列下標)的所有值,具體總結下其餘的方法
阿新 • • 發佈:2019-02-20
1、專案中經常會用到獲取多維陣列某個特定鍵的所有值,經常的做法是迴圈獲取,今天在網上看到一個不用迴圈獲取的辦法。
/* author: [email protected] 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;
}