在 Node.js 模块库中有很多好用的模块。接下来我们为大家介绍几种常用模块的使用: 序号 模块名 & 描述 1 OS…
August 24, 2016
PHP: 获取二维或多维数组中key键(特定键)值的集合
在处理php数组的时候,有一种需求特别的频繁,如下二维数组:
$arr = array( array( 'id' => 1, 'name' => 'gideon' ), array( 'id' => 2, 'name' => 'lisha' ) );
目的就是要取到key为name的集合,得到这个结果:
$arr2 = array('gideon','lisha');
这里有几种方法:
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,在陈旧项目中使用这个方法还是得斟酌一下哈
获取一维或多维数组某个特定键(数组下标)的所有值 , 原创代码:
先假设一个数组:
$arr = array( array( 'id' => 1, 'name' => 'gideon', 'sex' => 'male', ), array( 'id' => 2, 'name' => 'lisha', 'sex' => 'female', 'son' => array( 'id' => 3, 'name' => 'samuel', 'sex' => 'male', ) ) );
然后实例如下:
/* * created by justcode.ikeepstudying.com * usage: * get_keys_from_array($array, 'key'); * get_keys_from_array($array, array('key1','key2')); */ function get_keys_from_array($arr, $keys) { if (!$keys) return false; $output = array(); $json = array2json($arr); if(is_array($keys)) { foreach($keys as $key) { preg_match_all('/(.*?)"'.$key.'":"(.*?)"(.*?)/', $json, $res); $output[$key] = $res[2]; } } else { preg_match_all('/(.*?)"'.$keys.'":"(.*?)"(.*?)/', $json, $res); $output = $res[2]; } return $output; } echo '<pre>'; print_r (get_keys_from_array($arr, 'name')); print_r (get_keys_from_array($arr, array('id','name'))); echo '</pre>'; /* result: Array ( [0] => gideon [1] => lisha [2] => samuel ) Array ( [id] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [name] => Array ( [0] => gideon [1] => lisha [2] => samuel ) ) */
array2json 是自定义的一个函数,可以参考下面:
function array2json($array) { _arrayRecursive($array, 'urlencode', true); return urldecode(_jsonEncode($array)); } function _arrayRecursive(&$array, $function, $apply_to_keys_also = false) { foreach ($array as $key => $value) { if (is_array($value)) _arrayRecursive($array[$key], $function, $apply_to_keys_also); else $array[$key] = $function($value); if ($apply_to_keys_also && is_string($key)) { $new_key = $function($key); if ($new_key != $key) { $array[$new_key] = $array[$key]; unset($array[$key]); } } } } function _jsonEncode($var) { if (function_exists('json_encode')) return json_encode($var); else { switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; // Lowercase necessary! case 'integer': case 'double': return $var; case 'resource': case 'string': return '"'. str_replace(array("\r", "\n", "<", ">", "&"), array('\r', '\n', '\x3c', '\x3e', '\x26'), addslashes($var)) .'"'; case 'array': // Arrays in JSON can't be associative. If the array is empty or if it // has sequential whole number keys starting with 0, it's not associative // so we can go ahead and convert it as an array. if (empty ($var) || array_keys($var) === range(0, sizeof($var) - 1)) { $output = array(); foreach ($var as $v) $output[] = _jsonEncode($v); return '[ '. implode(', ', $output) .' ]'; } // Otherwise, fall through to convert the array as an object. case 'object': $output = array(); foreach ($var as $k => $v) $output[] = _jsonEncode(strval($k)) .': '. _jsonEncode($v); return '{ '. implode(', ', $output) .' }'; default: return 'null'; } } }
array2json 函数可以作为一个公共函数使用.
更多参考:
http://justcoding.iteye.com/blog/708685
本文: PHP: 获取二维或多维数组中key键(特定键)值的集合
One Comment