在PHP中减少一个对象数组

5

我有一个对象数组,就像这样:

$my_array = [
    (object) ['name' => 'name 0'],
    (object) ['name' => 'name 1'],
    (object) ['name' => 'name 2'],
];

我希望将它简化为所有name属性的连接,例如:

name 0 / name 1 / name 2

一种方法是:

$result = [];
foreach ($my_array as $item) {
    $result[] = $item->name;
}
echo implode(' / ', $result);

但我更希望使用更加紧凑的方式,比如使用array_map

implode(' / ', array_map(function($item) {
    return $item->name; 
}, $my_array ));

考虑到我实际上想将一个数组减少为一个字符串,我认为使用 array_reduce 会更清晰,但是我能想出的唯一解决方案是:

array_reduce($my_array, function($carry, $obj) {
    return empty($carry) ? $obj->name : $carry .= " / $obj->name"; 
});

尽管如此,它并没有让人感觉更加干净... 因此问题很简单:

有没有人能想出一个易于理解的更好/更干净的解决方案?


4
你应该选择易于理解的方案,而不是更加简洁或短小的方案。 - u_mulder
感谢@PrafullaKumarSahu。由于$my_array不是一个对象而是一个对象数组,因此get_object_vars返回NULL。你的观点是什么? - Jordi Nebot
好的@u_mulder,但我问这个问题是因为可能有比我的更好(更干净和易懂)的解决方案。我编辑了我的问题。谢谢 :) - Jordi Nebot
2个回答

7
你可能正在寻找array_column(),它会获取指定列的所有值:
$result = array_column($largeArray, 'name');// take all values with the key 'name'

// If you want it with a slash:
echo implode(" / ", $result);

不需要过多解释,这就是你应该选择的代码类型。虽然看起来很花哨,但没人能够理解的奇怪功能更糟糕。你现在可能明白它的作用,但如果你放置6个月后再回来,你同样会忘记它。

通常情况下:可维护性>复杂性(有时候甚至>性能)


这是一种你不会每天都使用的函数,但在像这样的情况下,它非常完美。而且由于它使用了 PHP 函数而不是自己编写的循环,我猜测性能会更好(因为在 PHP 中循环永远不会真正快速)。 - Martijn

2
trim (array_reduce($my_array, function($carry, $obj) {
    return "$carry / {$obj->name}"; 
}), " /");

这种方法更加干净,但可能会有一些副作用。如果名字以“/”开头或姓氏以“/”结尾,则它们将丢失。例如:

$my_array = [
    (object) ['name' => '/name 0'],
    (object) ['name' => 'name 1'],
    (object) ['name' => 'name 2/'],
];

当使用原始代码时,结果为/name 0 / name 1 / name 2/,而使用trim后结果为name 0 / name 1 / name 2


谢谢Alex,请问你能更具体地说明一下副作用吗? - Jordi Nebot

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