减少PHP

时间:2017-07-07 08:54:31

标签: php arrays

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

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

我想将其缩减为所有name属性的串联,如:

  

姓名0 /姓名1 /姓名2

一种方法是:

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

但我更喜欢更多 compact ,比如使用array_map

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

鉴于实际上我想将 reduce 和数组转换为字符串,我认为array_reduce会更清晰,但我能提出的唯一解决方案是:

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

然而,它并没有感觉更干净......所以问题很简单:

有人能想到一个可理解的更好/更清洁的解决方案吗?

2 个答案:

答案 0 :(得分:1)

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

根据我的口味有点清洁,但可能有一些副作用。如果名字以' /'开头或者姓氏以' /'结尾,它们就会丢失。 e.g:

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

结果/name 0 / name 1 / name 2/包含原始代码,name 0 / name 1 / name 2结果使用trim

答案 1 :(得分:1)

您可能正在寻找array_column(),其中包含给定列的值:

$result = array_column($largeArray, 'name'); // take all 'name' values

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

不需要更多解释。你应该选择哪种代码。奇怪的功能感觉很奇特,但没有人能理解更糟糕。你可能会理解它现在的作用,但是如果你把它单独放置6个月然后回来,你就会忘记它。

通常; 可维护性>复杂性有时甚至>性能