如何使用从 stdClass 对象数组中内爆列


How to use implode a column from an array of stdClass objects?

我有一个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(),但不需要先遍历arrayimplode()将直接调用对象的__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);