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

javascript数组的使用(索引数组和关联数组)

 

本文:  PHP: 获取二维或多维数组中key键(特定键)值的集合

One Comment

Leave a Reply