【问题标题】:PHP: Return Array of Values from Key in Associative Array [duplicate]PHP:从关联数组中的键返回值数组[重复]
【发布时间】:2015-07-23 21:54:17
【问题描述】:

假设我有一个这样的数组:

$people = array(
    array(
        'name' => 'Bob',
        'job'  => 'Carpenter'
    ),

    array(
        'name' => 'George',
        'job'  => 'Programmer'
    ),

    array(
        'name' => 'Clint',
        'job'  => 'Actor'
    )
);

我想知道所有这些人的名字。

我知道我可以这样做:

$names = array();

foreach($people as $person)
    $names[] = $person['name'];

但是假设我很懒,所以我为它创建了一个函数:

/**
 * Returns an Array of Values paired with the specified $key
 * in the $array of Associative Arras.
 *
 * @param array  $array The Array of Associative Arrays.
 * @param string $key   The Key within each Associative Array to retrieve the Value
 *
 * @return array The Array of Keyed Values within the Array of Arrays.
 */
function array_keyed_values($array, $key)
{
    $values = array();

    foreach($array as $associative)
        if(array_key_exists($key, $associative))
            $values[] = $associative[$key];

    return $values;
}

酷,我已经正式解决了我的问题。我只需要这样做:

$names = array_keyed_values($people, 'name');

获得:

(Bob, George, Clint)

我已经完成了。

但是,我怀疑我是第一个需要这种功能的人。鉴于 PHP 充斥着大量古怪的函数,这些函数会做一些奇怪的事情,我想知道这样的事情是否已经存在。

是的,我知道,通过不编写我需要的函数,我只为自己节省了 10 到 20 行代码,但是在一个使用大量文件的框架中,我不得不不断地包含一个库来做一些如此简单的事情变得有点乏味。

我已经尝试过四处搜索,但我可能没有使用正确的关键字。像这样的东西涉及数组、键和值,所以搜索这类东西往往会不断地将我指向 array_keys() 或 array_values(),这两者都不是我想要的。

注意:

对于我正在使用的特定应用程序,返回时值的顺序并不重要。

另外,我使用的 PHP 版本是 5.3。如果更高版本的 PHP 添加了此功能,请在您的回答中说明。

编辑:

以下solution 在这种情况下工作:

$result = array_map(function($v) { return $v['name']; }, $people);

但是,我也使用它来解决类似的问题,其中我有一个对象数组(其中对象和键是变量的嵌套数组)。通过稍微修改上面的代码,我也解决了这个问题:

$result = array_map(function($v) { return $v->name; }, $people);

虽然array_column() 适用于我的场景(如果我使用的是 PHP 5.5+ 而不是 PHP 5.3),但它不适用于上述修改后的解决方案 (因此进行了编辑) .

【问题讨论】:

    标签: php arrays multidimensional-array key associative-array


    【解决方案1】:

    PHP >= 5.5.0:

    $result = array_column($people, 'name');
    

    旧版本 >= 5.3.0:

    $result = array_map(function($v) { return $v['name']; }, $people);
    

    对于更老的人,只需使用带有具体功能的array_map。

    【讨论】:

    • 旧版本只是意味着:>= 5.3 :)
    • 是的,已编辑.....任何早于 5.3.0 的版本,您都会遇到更多问题。它已经 6 岁了。
    • 是的,那么您必须将函数名称作为字符串传递或使用create_function(),这不是最好的解决方案
    • 真的吗?那会是什么? foreach?已经在 OP 中了。
    • 这对我有用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2023-03-06
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    相关资源
    最近更新 更多