Как использовать implode для массива объектов stdClass?

У меня есть массив объектов 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 (или какой-либо другой функции тайны) без необходимости ставить этот массив объектов через цикл?

Related of "Как использовать implode для массива объектов stdClass?"

Вы можете использовать array_map() и implode()

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

Это на самом деле лучший способ, который я нашел, на него, похоже, нет ответа, потому что массив объектов должен иметь возможность обрабатывать динамический размер.

 $str = implode(',', array_map(function($x) { return $x->foo; }, $a)); 

Это также кажется самым чистым решением, которое я видел.

Фактически вы можете установить __toString() в классе, как это было предложено Ray, но вам не нужно сначала перебирать array . implode() будет напрямую вызывать функцию __toString() объектов (которая также работает с ассоциативными массивами, кстати).

Очень аккуратным решением для этого является array_reduce() , которая уменьшает массив до одного значения:

 $str = array_reduce($a, function($v, $w) { if ($v) $v .= ','; return $v . $w->foo; }); 
 echo implode("','",(array)$data->stdArray); 

Я думаю, самый простой способ – создать индексный индексный массив, а затем вызвать implode на 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)); 

Нет, лучшее, что вы можете сделать, это перебрать, вызвать 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);