Как использовать 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 (или какой-нибудь другой загадочной функции) без необходимости помещать этот массив объектов в цикл?
8 ответов
Вы могли бы использовать 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));
Это также кажется самым чистым решением, которое я видел.
Вы можете на самом деле установить __toString()
в классе, как это было предложено Рэем, но вам не нужно перебирать array
первый. implode()
будет напрямую вызывать __toString()
функция объектов (которая также работает с ассоциативными массивами, кстати).
Очень аккуратное решение для этого является array_reduce()
функция, которая сводит массив к одному значению:
$str = array_reduce($a, function($v, $w) {
if ($v) $v .= ',';
return $v . $w->foo;
});
Нет, лучшее, что вы можете сделать, это выполнить итерацию, вызвать tostring() для объекта и поместить результаты в новый массив для вызова implode.
Я предполагаю, что самый простой способ - создать индексированный массив с ID и затем вызвать 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));
Если это объект 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);