【问题标题】:stdClass Object In Array Iteration数组迭代中的 stdClass 对象
【发布时间】:2019-05-22 03:25:03
【问题描述】:

如果我这样做print_r($results),我有一个包含 stdClass 对象的数据数组:

Array ( 
    [0] => stdClass Object ( 
        [ID] => 1 
    ) 
    [1] => stdClass Object ( 
        [ID] => 2 
    ) 
    [2] => stdClass Object ( 
        [ID] => 3 
    ) 
) 

我需要以逗号分隔字符串的形式获取 ID 的值。为此,我最初尝试执行 implode(",", $results) 但这会由于 stdClass 对象而出错。因此,经过合理的阅读和检查 SO 等,我已经到了可以访问给定记录上 ID 值的地步:$results[0]->ID

但是,由于这些数据来自数据库查询,我不知道会有多少行。所以,我需要遍历每一行并将其添加到一个字符串中。

我 - 除其他外 - 试过这个:

$i = 0;
foreach ($results as $result){

    //$result->ID;
    $result[$i]['ID'];
    $i++

}

这些返回错误:

致命错误:未捕获的错误:无法将 stdClass 类型的对象用作 数组

我现在完全不知道如何将所有 ID 值作为逗号分隔的字符串。

我查看了许多 SO 帖子,包括以下内容: - 'Cannot use object of type stdClass as array' using Wordpress - iterating through a stdClass object in PHP - PHP Loop stdClass Object

更新 我得到的数据如下:

global $wpdb;    
$query = "Select wp_users.ID from wp_users where wp_users.ID not in ( select wp_usermeta.user_id from wp_usermeta where wp_usermeta.meta_key = 'grp2_profile_visiblity' and wp_usermeta.meta_value = 1 order by wp_usermeta.user_id ) order by wp_users.ID"; 
$results = $wpdb->get_results( $query, OBJECT );

谢谢

【问题讨论】:

  • 如何从 DB 查询中获取数据 - 您可以在那里执行此操作,而不是破坏输出。
  • 您提供的代码将返回比该错误更多的代码,因为您使用了一个未定义的常量 i,我猜您的意思是 $i,这没有任何意义您显示的数据。您可能想了解foreach 的工作原理,其想法是摆脱老式for 循环中使用的迭代计数器。
  • @miken32 - 是的,这搞砸了。我很沮丧,并试图在娱乐孩子的同时快速打字。
  • 别担心,试一试我的回答,告诉我它对你有什么作用(一旦你让孩子们上床睡觉!)
  • @miken32 我已将查询添加到我的问题中。

标签: php arrays wordpress object stdclass


【解决方案1】:

使用array_column() 很容易获得 ID 值;它对对象的作用与对数组的作用一样好。

<?php
// some sample data
$results = json_decode('[{"ID": 1}, {"ID": 2}, {"ID": 3}]');

$return = implode(",", array_column($results, "ID"));
echo $return;

输出:

1,2,3

【讨论】:

  • 太棒了,这也可以。我将@Curious_Mind 的答案标记为已接受,纯粹是因为它的性能似乎稍好一些。谢谢。
  • 这很令人惊讶,但只要你有一些有用的东西。 PHP 处理数组的函数通常比循环快。他们当然更漂亮;)
  • 我已将 SQL 查询添加为我的 OP 的编辑。如果您可以通过 SQL 提出一种获得所需结果的方法,我很乐意学习它。谢谢。
  • 我想你会找GROUP_CONCAT,但我自己从来没有用过。
  • 是的,在我检查了 Curious_Mind 演示的性能选项卡之前,您的解决方案是我的首选。然后我尝试了你的,它出来的速度更慢,内存略多。 3v4l.org/oUCkL
【解决方案2】:

你得到-

致命错误:未捕获的错误:无法将 stdClass 类型的对象用作 数组

致命错误,因为 PHP array 可以使用括号 [] 表示法访问,而 object 是箭头 -&gt;

让我们这样做,使用foreach()implode() 来获得逗号分隔的ID,例如1,2,3,但我也认为您可以从数据库查询端修复它,而无需在此处修改输出:) 希望这对先生有所帮助。

$expected = [];
foreach ($results as $key=>$obj){
    $expected[] = $obj->ID;
}
echo implode(',',$expected);

工作演示: https://3v4l.org/oUCkL

【讨论】:

  • 谢谢。这很好用。我接受了您的回答,因为它似乎比@miken32 的解决方案具有更好的性能。
  • 我已将 SQL 查询添加为我的 OP 的编辑。如果您可以通过 SQL 提出一种获得所需结果的方法,我很乐意学习它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2013-10-01
  • 1970-01-01
相关资源
最近更新 更多