Как вывести все элементы с одинаковым ключом из массива?

1

У меня есть этот массив:

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 я type_id его, но есть 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 
  • 1
    Вы используете MySQL? если да, вы можете попробовать использовать GROUP BY type_id и GROUP_CONCAT
  • 0
    может быть, я не знаю, как использовать / поместить их в запрос, но это не дает мне нужный мне результат
Показать ещё 2 комментария
Теги:
arrays
mysqli

3 ответа

0
Лучший ответ

Вы должны восстановить массив с помощью 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/>";
       }
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>';
    }
}
0

Это то, что я имел в виду в своем комментарии:

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 здесь, если вы хотите изменить, как значения неоспоримые сцепляются.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню