【问题标题】:How to create new arrays from object array based on user_id?如何根据 user_id 从对象数组创建新数组?
【发布时间】:2019-11-18 11:43:20
【问题描述】:

我在循环对象数组并在某些条件下显示其中的数据时遇到问题。

我希望网页显示以下内容:

<p>John Doe</p> <p>William Green</p> <p>Jane Smith</p>

我知道如何通过定义 $user[0]->first_name 来做到这一点。 $user[0]->last_name 特别是,但我需要一种让代码循环并使用 user_id 属性作为唯一标识符动态显示名称的方法。

对于数组中 user_id 为 1 的所有对象,返回“这些值”。对于 user_id 为 2 的数组中的所有对象,返回“这些值”。依此类推……循环遍历每个唯一的 user_id。

这里是对象数组的一个var_dump:

array(4)
{   [0]=> object(stdClass)#4336 (4)
        {
        ["umeta_id"]=> string(1) "1"
        ["user_id"]=> string(1) "1"
        ["meta_key"]=> string(10) "first_name"
        ["meta_value"]=> string(4) "John" 
        }
    [1]=> object(stdClass)#4333 (4)
        {
        ["umeta_id"]=> string(1) "2"
        ["user_id"]=> string(1) "1"
        ["meta_key"]=> string(9) "last_name"
        ["meta_value"]=> string(3) "Doe"
        }
    [2]=> object(stdClass)#4334 (4)
        {
        ["umeta_id"]=> string(1) "3"
        ["user_id"]=> string(1) "2"
        ["meta_key"]=> string(10) "first_name"
        ["meta_value"]=> string(4) "Jane"
        }
    [3]=> object(stdClass)#4334 (4)
        {
        ["umeta_id"]=> string(1) "4"
        ["user_id"]=> string(1) "2"
        ["meta_key"]=> string(9) "last_name"
        ["meta_value"]=> string(5) "Smith"
        }
    [4]=> object(stdClass)#4334 (4)
        {
        ["umeta_id"]=> string(1) "5"
        ["user_id"]=> string(1) "3"
        ["meta_key"]=> string(10) "first_name"
        ["meta_value"]=> string(7) "William"
        }
    [5]=> object(stdClass)#4334 (4)
        {
        ["umeta_id"]=> string(1) "6"
        ["user_id"]=> string(1) "3"
        ["meta_key"]=> string(9) "last_name"
        ["meta_value"]=> string(5) "Green"
        }
}

当我在网页上输出信息时,我希望它看起来像这样:

<p>John Doe</p> <p>William Green</p> <p>Jane Smith</p>

也许我需要遍历对象并基于 user_ids 构建新数组?请不要提供带有 echo 或 print_r 的代码。此项目只能使用“return”。

【问题讨论】:

    标签: php mysql arrays wordpress object


    【解决方案1】:

    所以$your_object 已经按umeta_iduser_id 字段排序了吗?

    如果没有,你可以使用usort

    function cmp1($a, $b)
    {
        return strcmp($a->umeta_id, $b->umeta_id);
    }
    function cmp2($a, $b)
    {
        return strcmp($a->user_id, $b->user_id);
    }
    
    usort($your_object, "cmp1");
    usort($your_object, "cmp2");
    

    那么简单:

    $str = '';
    for($i=0;$i<count($your_object);$i+=2){
      $str .= "<p>".$your_object[$i]->meta_value." "$your_object[$i+1]->meta_value."</p> ";
    }
    return $str; // this var contain all your data in string
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      这将生成名字和姓氏对:

      $user_group = array();
      
      ksort($user_group, SORT_NUMERIC);
      
      foreach ($users as $key => $item) {
          $name_meta = get_object_vars($item);
          foreach ($name_meta as $meta_in => $names) {
              if ($names == 'first_name') {
                  $user_group[$item->user_id]['first_name'] = $name_meta['meta_value'];
              }
              if ($names == 'last_name') {
                  $user_group[$item->user_id]['last_name'] = $name_meta['meta_value'];
              }
          }
      }
      

      输出:

      array(3) {
      [1]=>
      array(2) {
          ["first_name"]=>
          string(4) "John"
          ["last_name"]=>
          string(3) "Doe"
      }
      [2]=>
      array(2) {
          ["first_name"]=>
          string(4) "Jane"
          ["last_name"]=>
          string(5) "Smith"
      }
      [3]=>
      array(2) {
          ["first_name"]=>
          string(7) "William"
          ["last_name"]=>
          string(5) "Green"
      }
      }
      

      并打印用户名对:

      foreach ($user_group as $name) {
          echo "<p>" . $name['first_name'] . " " . $name['last_name'] . "</p>";
      }
      

      【讨论】:

      • 我用我的数据库查询变量替换了 $users,它运行良好。 Kudos Hasta...谢谢一堆.....foreach ($users as $key => $item)
      • $user_group[$item->user_id] 的行抛出此错误:注意:未定义的属性:stdClass::$user_id。无论如何要改善这一点?
      • 没关系...我想通了。我只需要更新我的 SELECT 语句。
      • 我很高兴能帮上忙 ;)
      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2022-07-20
      相关资源
      最近更新 更多