我有一组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);
我想要对该数组中所有foo
个对象的stdClass
内爆以创建逗号分隔列表。所以期望的结果是:
4,16,76
有没有办法用implode(或其他一些神秘函数)来做这个,而不必把这个对象数组放到一个循环中?
答案 0 :(得分:30)
您可以使用array_map()
和implode()
...
$a = array_map(function($obj) { return $obj->foo; },
array(1=>$obj1 , 2=>$obj2 , 3=>$obj3));
$a = implode(", ", $a);
答案 1 :(得分:7)
这实际上是我发现的最好的方法,它似乎没有在这里正确回答,因为对象数组应该能够处理动态大小。
$str = implode(',', array_map(function($x) { return $x->foo; }, $a));
这似乎也是我见过的最干净的解决方案。
答案 2 :(得分:6)
您可以按照Ray的建议在课程中设置__toString()
,但您不需要首先遍历array
。 implode()
将直接调用对象的__toString()
函数(也可以使用关联数组,顺便说一下)。
答案 3 :(得分:4)
一个非常巧妙的解决方案是array_reduce()
函数,它将数组减少为单个值:
$str = array_reduce($a, function($v, $w) {
if ($v) $v .= ',';
return $v . $w->foo;
});
答案 4 :(得分:1)
echo implode("','",(array)$data->stdArray);
答案 5 :(得分:0)
我想最简单的方法是创建一个ID索引数组,然后在array_keys上调用implode:
$a = array();
$a[4] = stdClass Object ( [foo] => 4 [bar] => 8 [foo-bar] => 15 );
$a[16] = stdClass Object ( [foo] => 16 [bar] => 23 [foo-bar] => 42 );
$a[76] = stdClass Object ( [foo] => 76 [bar] => 79 [foo-bar] => 83 );
echo implode(', ', array_keys($a));
答案 6 :(得分:0)
不,你可以做的最好的事情是迭代,在对象上调用tostring()并将结果放在一个新的数组中以调用implode。
答案 7 :(得分:0)
如果它是一个1级对象,这对我有用。
function implodeObjValues($glue, $obj) {
$s = "";
foreach($obj[1] as $n=>$v) {
$s .= $glue . $v;
}
return substr($s,strlen($glue));
}
function implodeObjLabels($glue, $obj) {
$s = "";
foreach($obj[1] as $n=>$v) {
$s .= $glue . $n;
}
return substr($s,strlen($glue));
}
可以包含一个按类型的多级进程,但我还不需要它。 希望这会有所帮助。
方便将MySQL对象转换回数组。
$db = new mysqli("localhost",$usr,$pw,$db);
$row = $db->query("SHOW TABLES");
$a = implodeObjValues("|",$row);
答案 8 :(得分:0)
使用PHP 7.0+,您可以为此使用array_column
。
echo implode(',', array_column($a, 'foo'));