/** * @param array $arr1 * @param array $arr2 * * @return array */ function array_merge_recursive_overwrite($arr1, $arr2) { if (debug_assert(is_array($arr1) && is_array($arr2))) { foreach ($arr2 as $key => $value) { if (array_key_exists($key, $arr1) && is_array($value)) { $arr1[$key] = array_merge_recursive_overwrite($arr1[$key], $arr2[$key]); } else { if (isset($value)) { $arr1[$key] = $value; } } } } return $arr1; }
function array_merge_recursive_overwrite() { $args = func_get_args(); $destination = array(); foreach ($args as $arr) { foreach ($arr as $key => $value) { if (array_key_exists($key, $destination) && is_array($value)) { $destination[$key] = array_merge_recursive_overwrite($destination[$key], $arr[$key]); } else { $destination[$key] = $value; } } } return $destination; }
/** * 获取数组下面的某些项的集合 * 如 $a = array('a' => array('f1'=>'v1','f2'=>'v2','f3'=>'v3'),'b' => array('f1'=>'v4','f2'=>'v5'),'c'=>array('f1'=>'v6')); * 如 $selector = 'a,b/f1'; 得到 array('a' => array('f1'=>'v1'),'b' => array('f1'=>'v4')); * 如 $selector = 'a/*'; 得到 array('a' => array('f1'=>'v1','f2'=>'v2','f3'=>'v3')); * * @param array $data 数组 * @param string $selector 条件表达式 [/] 表示数组维度; [[,][;] (逗号,分号)表示同维度KEY1和KEY2和KEYN...; [*] 表示同维度全部的KEY,此参数注意事项请见_array_selector_keymaker; * @return array 返回根据表达式计算出来的值 */ function array_selector(array $data, $selector = '*') { if (!is_array($data)) { return false; } $result = array(); //print_r($result); if (!empty($selector)) { $root = _array_selector_keymaker($selector); foreach ($root as $keys) { $_data = $data; _array_selector_rev($_data, $keys); // $result = array_merge_recursive_overwrite($result, $_data); } } return $result; }