PHP数组映射

pow*_*tac 16 php arrays mapping multidimensional-array

有没有比foreach获得所有"标签"值数组更清晰的方法?

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


foreach($methods as $method) {
    $methodsLabel[] = $method['label'];
}
Run Code Online (Sandbox Code Playgroud)

irc*_*ell 26

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

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

毕竟,告诉我一眼就能告诉你它的作用更多:

$results = array();
foreach ($array as $value) {
    $results[] = $value['title'];
}
Run Code Online (Sandbox Code Playgroud)

VS

$results = array_map(function($element) {
        return $element['title'];
    },
    $array
);
Run Code Online (Sandbox Code Playgroud)

要么:

$callback = function($element) {
    return $element['title'];
}
$results = array_map($callback, $array);
Run Code Online (Sandbox Code Playgroud)

就个人而言,第一个对我来说是最好的.这是不知道显而易见东西它在做什么.其他人需要了解array_map语义知识.结合较慢的事实,这array_map 双赢foreach.

代码应该只是必要的优雅.它首先应该是可读的......

  • @powtac:我仍然站在一个直接的foreach后面,更易读,更容易理解.如果不是更少的代码与foreach,你说的是相同的,所以我没有看到好处...... (2认同)

Jac*_*kin 16

当然,使用array_map:

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

$labels = array_map('getLabelFromMethod', $methods);
Run Code Online (Sandbox Code Playgroud)

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

$labels = array_map(function($m) {
   return $m['label'];
}, $methods);
Run Code Online (Sandbox Code Playgroud)


小智 8

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

$methodsLabel = array_column($methods, 'label');
Run Code Online (Sandbox Code Playgroud)

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


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


efr*_*itz 5

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

$methodsLabel = array_map(function($item) { return $item['label']; }, $methods);
Run Code Online (Sandbox Code Playgroud)


Gau*_*rav 5

array_map('array_shift', $methods);
Run Code Online (Sandbox Code Playgroud)

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

  • 要非常小心.如果假设因任何原因而中断(由于任何原因,`label`的排序方式不同),代码将返回不正确的结果. (3认同)