版權聲明:本文為博主原創文章,未經博主允許不得轉載。
- <span style="color:rgb(68,68,68); font-family:'Lucida Grande',Verdana,'Bitstream Vera Sans',Arial,sans-serif; font-size:14px; line-height:24px">1、項目中經常會用到獲取多維數組某個特定鍵的所有值,經常的做法是循環獲取,今天在網上看到一個不用循環獲取的辦法。</span>
- /*
- 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;
- }
