我有一个对象数组。像这样:
$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";
});
然而,它并没有感觉更干净......所以问题很简单:
有人能想到一个可理解的更好/更清洁的解决方案吗?
答案 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个月然后回来,你就会忘记它。
通常; 可维护性>复杂性(有时甚至>性能)