从每个子数组中获取特定元素

31

我有一个常见的模式,我相信PHP中一定有一个内置的数组函数来处理它,但我只是看不到它。

我有多个数组,例如以下内容:

$testArray = array (
    'subArray1' => array(
        'key1' => "Sub array 1 value 1",
        'key2' => "Sub array 1 value 1"
    ),
    'subArray2' => array(
        'key1' => "Sub array 2 value 1",
        'key2' => "Sub array 2 value 2"
    )
);

我需要获取每个子数组中的key1值,其中子数组的数量可以是任意的。

我一直只是循环遍历每个数组来获取所需的值,但我相信一定有更简单、更高效的方法来处理这个问题。

我目前正在使用以下简单的foreach解析数组:

$preparedSubs = array();

foreach($testArray as $subArray) {
    $preparedSubs[] = $subArray['key1'];
}

我尽可能地缩短了它,但正如我所说,我相信有一种PHP结构可以更好地处理这个问题。


你想从每个子数组中获取key1的值并将其存储到另一个数组中吗? - ro ko
@Rohan - 最好返回该键所属的值,或者同时返回键和值。我将发布我目前正在使用的foreach循环。 - Marty Wallace
2个回答

39

在PHP 5.5之前,这将是最高效的解决方案:

$key = 'key1';

$output = array_map(function($item) use ($key) {
    return $item[$key];
}, $testArray);

从PHP 5.5开始,现在有一个array_column函数可以实现这个功能(参见COil的答案)。


5
注意:PHP闭包从PHP 5.3开始支持,因此这个方法在5.3及以上版本中可以使用,但在5.5版本之后已不再必要。 - Andron
以下答案也有效:)这样更简单。谢谢 - BlackBurn027
1
这个问题是在PHP 5.5发布之前提出的。当COil的答案在3年后被添加时,我更新了我的问题来反映这一点 :-) - cmbuckley

28

从PHP 5.5开始,您可以使用array_column()函数:

$key = 'key1';

$testArray = array (
    'subArray1' => array(
        'key1' => "Sub array 1 value 1",
        'key2' => "Sub array 1 value 2"
    ),
    'subArray2' => array(
        'key1' => "Sub array 2 value 1",
        'key2' => "Sub array 2 value 2"
    )
);

$output = array_column($testArray, $key);
var_dump($output);

将输出:

array(2) {
  [0]=>
  string(19) "Sub array 1 value 1"
  [1]=>
  string(19) "Sub array 2 value 1"
}

与被接受的答案唯一的不同之处在于失去了原始键名,但我认为在您的情况下这不是一个问题。


6
新的本地函数值得称赞。你可以使用 array_combine(array_keys($testArray), array_column($testArray, $key)) 来保留原始键。 - cmbuckley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接