【问题标题】:How to output all elements with the same key from an array?如何从数组中输出具有相同键的所有元素?
【发布时间】:2015-08-16 12:45:15
【问题描述】:

我有这个数组:

array(3) {
  [0]=>
  object(stdClass)#232 (3) {
    ["id"]=>
    string(2) "14"
    ["name"]=>
    string(13) "pdfs Shoulder"
    ["type_id"]=>
    string(1) "4"
  }
  [1]=>
  object(stdClass)#231 (3) {
    ["id"]=>
    string(2) "14"
    ["name"]=>
    string(13) "pdfs Shoulder"
    ["type_id"]=>
    string(1) "7"
  }
  [2]=>
  object(stdClass)#230 (3) {
    ["id"]=>
    string(2) "15"
    ["name"]=>
    string(3) "112"
    ["type_id"]=>
    string(1) "7"
  }
}

使用foreach我会输出它,但是,有3个type_id键,一个是4,两个是7,所以输出是这样的:

Course Name: 4
   File: pdfs Shoulder
Course Name: 7
   File: pdfs Shoulder
Course Name: 7
   File: 112

但我希望它是这样的:

 Course Name: 4
   File: pdfs Shoulder
Course Name: 7
   File: pdfs Shoulder
   File: 112

我不知道该怎么做...... 如果修改查询更容易解决,这是我使用的查询:

SELECT lm.id,lm.name,lm.local, lmr.access as access,lmr.type_id
                FROM `media` as lm
                LEFT JOIN `mediarel` as lmr
                ON lm.id=lmr.media_id
                WHERE `lmr`.`type_id` IN ({$ids})
                AND lm.published = 1 and flag=1 and lmr.type='pmed' order by lmr.order 

【问题讨论】:

  • 你在用mysql吗?如果你是,你可以尝试使用GROUP BYtype_idGROUP_CONCAT
  • 也许我不知道如何使用/将它们放入查询中,但它没有给我需要的结果
  • 但是是mysql吗?因为sql server不支持GROUP_CONCAT
  • 是 mysql。我不确定如何使用它们 tbh

标签: php arrays mysqli


【解决方案1】:

在您的查询中使用GROUP BY 可能会更好,您应该阅读并尝试了解它的用法。

如果你只是想使用你所拥有的,你可以这样做:

$newArray = [];
foreach ($array as $val) {
    if (!isset($newArray[$val->type_id])) $newArray[$val->type_id] = [];
    $newArray[$val->type_id][] = $val->name;
}

这会给你这个:

array(2) {
  [4]=>
  array(1) {
    [0]=>
    string(13) "pdfs Shoulder"
  }
  [7]=>
  array(2) {
    [0]=>
    string(13) "pdfs Shoulder"
    [1]=>
    string(3) "112"
  }
}

你可以这样显示输出:

foreach ($newArray as $k => $val) {
    echo 'Course Name: '.$k.'<br>';
    foreach ($val as $v) {
        echo '    File: '.$v.'<br>';
    }
}

【讨论】:

    【解决方案2】:

    您必须使用 type_id 重新构建您的数组,然后您可以根据需要显示它。你可以这样做:

          //reconstructing with type id
           $sorted_courses = array();
           foreach ($array as $course) {
               $sorted_courses[$course->type_id][] = (object) array(
                           'id' => $course->id,
                           'name' => $course->name
               );
           }
    
    
           //viewing 
           foreach ($sorted_courses as $key => $files) {
               echo "Course Name: " . $key . "<br/>";
               foreach ($files as $file) {
                   echo "File: " . $file->name . "<br/>";
               }
               echo "<br/>";
           }
    

    【讨论】:

      【解决方案3】:

      这就是我在评论中的意思:

      SELECT lm.id,GROUP_CONCAT(lm.name),lm.local, lmr.access as access,lmr.type_id
          FROM `media` as lm
          LEFT JOIN `mediarel` as lmr
          ON lm.id=lmr.media_id
          WHERE `lmr`.`type_id` IN ({$ids})
          AND lm.published = 1 and flag=1 and lmr.type='pmed' order by lmr.order
          GROUP BY lmr.type_id
      

      如果您想更改值的连接方式,可以阅读有关 GROUP_CONCAT here 的更多信息。

      【讨论】:

        猜你喜欢
        • 2020-04-07
        • 1970-01-01
        • 2021-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多