如何使用从 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()
,但您不需要先遍历 array
。 implode()
将直接调用对象的 __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)成员/元素的属性? [复制]