如何在stdClass对象数组上使用implode?

ubi*_*con 17 php csv arrays stdclass implode

我有一个stdClass对象数组,我想使用所有这些stdClass对象的一个特定字段构建一个逗号分隔列表.我的数组看起来像这样:

$obj1 = stdClass Object ( [foo] => 4 [bar] => 8 [foo-bar] => 15 );
$obj1 = stdClass Object ( [foo] => 16 [bar] => 23 [foo-bar] => 42 );
$obj1 = stdClass Object ( [foo] => 76 [bar] => 79 [foo-bar] => 83 );

$a = array(1=>$obj1 , 2=>$obj2 , 3=>$obj3);
Run Code Online (Sandbox Code Playgroud)

我想破坏该数组中foo的所有stdClass对象以创建逗号分隔列表.所以期望的结果是:

4,16,76
Run Code Online (Sandbox Code Playgroud)

有没有办法用implode(或其他一些神秘函数)做到这一点,而不必通过循环放置这个对象数组?

ale*_*lex 33

你可以使用array_map()implode()...

$a = array_map(function($obj) { return $obj->foo; }, 
               array(1=>$obj1 , 2=>$obj2 , 3=>$obj3));

$a = implode(", ", $a);
Run Code Online (Sandbox Code Playgroud)


Don*_*nic 14

使用 PHP 7.0+,您可以使用array_column此功能。

echo implode(',', array_column($a, 'foo'));
Run Code Online (Sandbox Code Playgroud)


Kri*_*man 7

这实际上是我发现的最好的方法,它似乎没有在这里正确回答,因为对象数组应该能够处理动态大小.

$str = implode(',', array_map(function($x) { return $x->foo; }, $a));
Run Code Online (Sandbox Code Playgroud)

这似乎也是我见过的最干净的解决方案.


Nik*_*iko 6

一个非常巧妙的解决方案是array_reduce()函数,它将数组减少到单个值:

$str = array_reduce($a, function($v, $w) {
    if ($v) $v .= ',';
    return $v . $w->foo;
});
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以__toString()按照Ray的建议实际设置类,但是你不需要遍历第array一个.implode()将直接调用__toString()对象的函数(也适用于关联数组,顺便说一句).