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

Posted

技术标签:

【中文标题】如何使用从 stdClass 对象数组中内爆一列?【英文标题】:How to use implode a column from an array of stdClass objects? 【发布时间】:2012-06-05 17:36:43 【问题描述】:

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

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

【问题讨论】:

如果你重载了对象的 toString() 方法。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

对于 php 7.0+,您可以为此使用 array_column

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

【讨论】:

仅当 foo 被声明为 public 时才有效。 @JochenJung 你能在 StdClass 对象中有非公共属性吗?【参考方案3】:
echo implode("','",(array)$data->stdArray);

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

如果它是 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);

【讨论】:

【参考方案6】:

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

$str = array_reduce($a, function($v, $w) 
    if ($v) $v .= ',';
    return $v . $w->foo;
);

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

我想最简单的方法是创建一个 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));

【讨论】:

【参考方案9】:

您可以使用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 循环。

以上是关于如何使用从 stdClass 对象数组中内爆一列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 php 中对以下数组/stdclass 对象进行排序? [复制]

如何访问数组的对象(stdClass Object)成员/元素的属性? [复制]

如何将 stdClass 对象打印为字符串?

JSON解码致命错误:不能使用stdClass类型的对象作为数组

我将如何读取这个数组(“stdClass Object”)

PHP致命错误:未捕获的错误:不能将stdClass类型的对象用作数组