我有一个stdClass
对象的数组,我想使用所有这些stdClass
对象的一个特定字段构建一个逗号分隔的列表。 我的数组如下所示:
$obj1 = stdClass Object ( [foo] => 4 [bar] => 8 [foo-bar] => 15 );
$obj2 = stdClass Object ( [foo] => 16 [bar] => 23 [foo-bar] => 42 );
$obj3 = stdClass Object ( [foo] => 76 [bar] => 79 [foo-bar] => 83 );
$a = array(1=>$obj1 , 2=>$obj2 , 3=>$obj3);
我想在该数组中的所有stdClass
对象foo
上内爆以创建一个逗号分隔的列表。 所以期望的结果是:
4,16,76
有没有办法用内爆(或其他一些神秘函数)做到这一点,而不必把这个对象数组通过循环?
您可以使用
array_map()
和implode()
...
$a = array_map(function($obj) { return $obj->foo; },
array(1=>$obj1 , 2=>$obj2 , 3=>$obj3));
$a = implode(", ", $a);
在 PHP 7.0+ 中,您可以使用 array_column
来实现此目的。
echo implode(',', array_column($a, 'foo'));
这实际上是我发现的最好的方法,这里似乎没有得到正确的回答,因为对象数组应该能够处理动态大小。
$str = implode(',', array_map(function($x) { return $x->foo; }, $a));
您实际上可以按照 Ray 的建议在类上设置__toString()
,但不需要先遍历array
。 implode()
将直接调用对象的__toString()
函数(顺便说一句,它也适用于关联数组)。
一个非常简洁的解决方案是 array_reduce()
函数,它将数组减少到单个值:
$str = array_reduce($a, function($v, $w) {
if ($v) $v .= ',';
return $v . $w->foo;
});
echo implode("','",(array)$data->stdArray);
我想最简单的方法是创建一个 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));
不,你能做的最好的事情就是遍历,在对象上调用 tostring() 并将结果放在一个新数组中以调用 implode。
如果它是一个 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);