可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have an array of stdClass
objects and I want to build a comma separated list using one specific field of all those stdClass
objects. My array looks like this:
$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);
And I want to implode on foo
of all the stdClass
objects in that array to create a comma separated list. So the desired result is:
4,16,76
Is there any way to do this with implode (or some other mystery function) without having to put this array of objects through a loop?
回答1:
You could use array_map()
and implode()
...
$a = array_map(function($obj) { return $obj->foo; },
array(1=>$obj1 , 2=>$obj2 , 3=>$obj3));
$a = implode(", ", $a);
回答2:
This is actually the best way I've found, it doesn't seem to be answered here properly as the array of objects should be able to handle dynamic size.
$str = implode(',', array_map(function($x) { return $x->foo; }, $a));
This also seems to be the cleanest solution I've seen.
回答3:
With PHP 7.0+ you can use array_column
for this.
echo implode(',', array_column($a, 'foo'));
回答4:
You can actually set __toString()
on the class as suggested by Ray, but you don't need to iterate through the array
first. implode()
will directly call the __toString()
function of the objects (which also works with associative arrays, btw).
回答5:
A very neat solution for this is the array_reduce()
function, that reduces an array to a single value:
$str = array_reduce($a, function($v, $w) {
if ($v) $v .= ',';
return $v . $w->foo;
});
回答6:
echo implode("','",(array)$data->stdArray);
回答7:
I guess the easiest way would be to create an ID indexed array and then call implode on array_keys:
$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));
回答8:
No, the best you can do is iterate through, call tostring() on the object and put the results in a new array to call implode on.
回答9:
If it's a 1-level object, this worked for me.
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));
}
Could include a by-type multi-level process, but I didn't need that yet.
Hope this helps.
Handy for converting MySQL object back to array.
$db = new mysqli("localhost",$usr,$pw,$db);
$row = $db->query("SHOW TABLES");
$a = implodeObjValues("|",$row);