PHP数组映射

时间:2011-02-24 17:33:27

标签: php arrays multidimensional-array mapping

是否有比foreach更清晰的方法来获取所有“标签”值的数组?

$methods[0]['label'] = 'test';
$methods[0]['nr']    = 99;
$methods[1]['label'] = 'whatever';
$methods[1]['nr']    = 10;


foreach($methods as $method) {
    $methodsLabel[] = $method['label'];
}

7 个答案:

答案 0 :(得分:25)

不,没有比实现代码更快的方法。由于函数调用的开销,所有其他方法都会变慢。对于一个小阵列,差异将是微不足道的,但对于一个大的阵列(100个成员左右,取决于实现),差异可能是巨大的......

你可以array_map它,但我会坚持你上面发布的原始PHP ...它更容易维护,恕我直言更具可读性......

毕竟,告诉我一目了然告诉你它的作用更多:

$results = array();
foreach ($array as $value) {
    $results[] = $value['title'];
}

vs

$results = array_map(function($element) {
        return $element['title'];
    },
    $array
);

或者:

$callback = function($element) {
    return $element['title'];
}
$results = array_map($callback, $array);

就个人而言,第一个对我来说是最好的。在不知道任何事情它正在做什么的情况下,它立即显而易见。其他人需要了解array_map语义才能理解。认为array_map 的事实较慢,而且foreach是双赢。

代码应该尽可能优雅。它应该是首先可读的......

答案 1 :(得分:16)

当然,请使用array_map

function getLabelFromMethod($method) {
   return $method['label'];
}

$labels = array_map('getLabelFromMethod', $methods);

如果你使用的是PHP 5.3+,你也可以使用lambda函数:

$labels = array_map(function($m) {
   return $m['label'];
}, $methods);

答案 2 :(得分:7)

从PHP 5.5+开始,这正是array_column()所做的:

$methodsLabel = array_column($methods, 'label');

http://php.net/manual/function.array-column.php


3v4l示例:https://3v4l.org/ZabAb

答案 3 :(得分:5)

array_map('array_shift', $methods);

这里假设标签将是每个数组的第一个元素。

答案 4 :(得分:4)

在PHP 5.3+上,您可以使用与array_map配对的匿名函数。

$methodsLabel = array_map(function($item) { return $item['label']; }, $methods);

答案 5 :(得分:2)

如果label是数组中的第一个元素,那么" current"使用array_map可以正常使用。

array_map('current', $methods); 

答案 6 :(得分:1)

Arrow functions已引入PHP 7.4,这使它更加简洁。

/// <summary>
/// vector class
/// </summary>
public class di_vector
{
    public double longitude { get; set; }

    public double latitude { get; set; }
}