如何使用implode函数将stdClass对象数组中的一列连接起来?

26

我有一个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上进行implode操作,以创建一个逗号分隔的列表。所期望的结果是:

4,16,76
有没有办法使用implode(或其他神秘函数)在不经过循环的情况下完成对这个对象数组的操作?

也许你可以通过重载对象的toString()方法来实现。 - clentfort
9个回答

38
你可以使用array_map()implode()...
$a = array_map(function($obj) { return $obj->foo; }, 
               array(1=>$obj1 , 2=>$obj2 , 3=>$obj3));

$a = implode(", ", $a);

这个方法可行且比循环更简洁,但不幸的是我发现使用 foreach 循环性能更好。使用 array_reduce 也得到了类似的结果 :( 我想我只能坚持使用 foreach 循环了。 - ubiquibacon

14

使用 PHP 7.0+,您可以使用 array_column 完成此操作。

echo implode(',', array_column($a, 'foo'));

只有在 foo 被声明为 public 时才有效。 - JochenJung
@JochenJung 你能在 StdClass 对象中拥有非公共属性吗? - Don't Panic

11

这实际上是我找到的最好的方法,似乎在这里没有得到适当解答,因为对象数组应该能够处理动态大小。

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

7
您实际上可以按照Ray的建议在类上设置__toString(),但您不需要先迭代arrayimplode()将直接调用对象的__toString()函数(顺便说一下,这也适用于关联数组)。

6
这个问题的一个非常简洁的解决方案是使用array_reduce()函数,该函数将一个数组减少为一个单一的值:
$str = array_reduce($a, function($v, $w) {
    if ($v) $v .= ',';
    return $v . $w->foo;
});

1
echo implode("','",(array)$data->stdArray);

0
不,你最好的做法是遍历数组,在对象上调用tostring()方法并将结果放入新数组中,然后再调用implode()方法。

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));

0
如果它是一个一级对象,这个方法对我有效。
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接