25

我有一组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);

我想对该数组foo中的所有stdClass对象进行内爆以创建一个逗号分隔的列表。所以想要的结果是:

4,16,76

有没有办法用 implode (或其他一些神秘的函数)来做到这一点,而不必让这个对象数组通过一个循环?

4

9 回答 9

37

你可以使用array_map()implode()...

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

$a = implode(", ", $a);
于 2012-05-31T12:54:09.513 回答
14

使用 PHP 7.0+,您可以使用array_column它。

echo implode(',', array_column($a, 'foo'));
于 2019-05-29T00:03:37.107 回答
9

这实际上是我发现的最好方法,这里似乎没有正确回答,因为对象数组应该能够处理动态大小。

$str = implode(',', array_map(function($x) { return $x->foo; }, $a));
于 2016-03-31T15:47:21.643 回答
7

您实际上可以__toString()按照 Ray 的建议设置类,但您不需要遍历第array一个。implode()将直接调用__toString()对象的函数(这也适用于关联数组,顺便说一句)。

于 2014-09-25T12:35:36.973 回答
6

一个非常巧妙的解决方案是array_reduce()函数,它将数组减少为单个值:

$str = array_reduce($a, function($v, $w) {
    if ($v) $v .= ',';
    return $v . $w->foo;
});
于 2012-05-31T12:58:35.107 回答
1
echo implode("','",(array)$data->stdArray);
于 2015-01-26T18:28:20.387 回答
0

我想最简单的方法是创建一个 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));
于 2012-05-31T12:54:34.550 回答
0

不,您能做的最好的事情是遍历,在对象上调用 tostring() 并将结果放入一个新数组中以调用 implode。

于 2012-05-31T12:54:51.353 回答
0

如果它是一个 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);
于 2014-08-08T15:41:14.113 回答