Как в php вывести данные из массива и отсортировать их.

Доброго времени суток уважаемые форумчане! В php имеется массив, состоящий из трёх элементов. Каждый элемент имеет структуру: name, company, position. Это (условный) список сотрудников, который содержит их имена, компанию в которой они работают и должность. Мне нужно вывести список и отсортировать его в зависимости от компании, грубо говоря, чтоб на экране было что-то похожее:

— ITStep
— Oksana
— Irina

— Samsung
— Olesya

Вот мой код:

PHP:
  1. <?php
  2. $user = [[‘name’ => «Oksana», ‘company’ => «ITStep», ‘position’ => «Teacher»],
  3.     [‘name’ => «Olesya», ‘company’ => «Samsung», ‘position’ => «Developer»],
  4.     [‘name’ => «Irina», ‘company’ => «ITStep», ‘position’ => «Teacher»],
  5.     ];
  6.  
  7.     $htmlConclusion = ‘<h2 class=»»>’;
  8.         foreach ($user as $key => $category) {
  9.             foreach ($category as $name => $value) {
  10.                 $htmlConclusion .=  ‘<h2>’ . $value . ‘</h2>’;
  11.                 }
  12.             }
  13. ?>
HTML:
  1.  
  2.       <div class=«container»>
  3.       <?= $htmlConclusion ?>
  4.       </div>
  5.  

Помогите пожалуйста разобраться.

 

PHP:
  1. <?php
  2.  
  3. function group( array $array, int | string | null $column ): iterable
  4. {
  5.     $all = [];
  6.  
  7.     foreach ( $array AS $row )
  8.     {
  9.         $all[ ( isset ( $row[$column] ) || array_key_exists ( $column, $row ) ? $row[$column] : reset ( $row ) ) ][] = $row;
  10.     }
  11.  
  12.     return $all;
  13. }
  14.  
  15. print_r ( group( array, company ) );
 

Говорит — синтаксическая ошибка в строке 3. (тут она 3)

 

PHP:
  1.     $htmlConclusion =» ;
  2.         foreach ($user as $value) {
  3.                 $htmlConclusion .= ‘<h2 class=»»>’. $value[‘company’] .‘ ‘.$value[‘name’].‘ ‘.$value[‘position’].‘</h2>’;
  4.             }
  5. print($htmlConclusion);
 

Не, он тут получается не сортирует. Нужно чтоб Оксана с Ириной были в ITStep, а Олеся в Самсунге.

 

Сортировка – это одно, а показанный вывод – другое.

Сортировка:

PHP:
  1. usort($user, fn($a, $b) => $a[‘company’] <=> $b[‘company’]);

Для вывода отслеживайте изменение значения company в смежных «записях» после сортировки по company (при появлении нового значения выводите его).

 

Начнем с того, что в этом списке нет уникального ID сотрудника. Или вы его туда не включили.
Иначе, при группировке этого списка, часть сотрудников будет потеряна. Если они будут иметь одинаковые имена например.
Поэтому-то у вас с этим списком затруднения и возникли. Как только добавите ID, так сразу и разберетесь.
Ну, может и не сразу.

 

Это лабораторная, по условиям задачки нет id. В учебных целях, самое начало изучения php. Тут наверное предполагается что не будет одинаковых имен :) За подсказку всё равно спасибо!

 

Тебе нужно сформировать другой массив на основе данного. Первым ключом у него будет company а вторым имя. В цикле перебирая первоначальный массив добавляем:

Код (Text):
  1.  
  2. $output = [ ‘Samsung’ => [] , ‘ITStep’ => [] ];
  3. foreach($user as $value){
  4.   if ($value[‘company’] == ‘ITStep’)
  5.      $output[‘ITStep’][] = $value;
  6.   else
  7.     $output[‘Samsung’][] = $value;
  8. }
  9. //а потом вывести массив $output
  10. foreach($output as $key ){
  11.   echo $key . ‘<br>’;
  12.   foreach ($key as $value){
  13.     echo $value. ‘<br>’;
  14.   }
  15. }
 

Во первых — автору нужна не сортировка, а группировка по компаниям и далее вывод.
Во вторых

обновись, динозавров не поддерживаю

 

Можешь считать такими ID индексы основного массива, если без них никак ;)
— Добавлено —
Про ID я в общем-то согласен, причем не только сотрудника, но и компании, однако к делу это не относится, т.к. это учебная задачка, что ТС подтвердил.
— Добавлено —

Автору нужна группировка при выводе, так что просто сортировать «записи» в качестве осн. действия более чем норм.

 

ты сам понял что написал ? Тебе сначала надо сгруппировать данные — это 1 действие, только после будешь выводить. Какая сортировка тут ? сортировка чего ? зачем ? o_O

 

Странно, что ты не понял. Хотя нет, не странно :D

 

давай сюда код со своей сортировкой и выводом от А до Я. Я тебя разнесу сейчас.

 

См. выше. Вывод описан словами, если не понятно :)
— Добавлено —
Это обычная «группировка при выводе», так что было лень код писать. Пусть ТС хоть немного потрудится.

 

Я не вижу код твоего примера. Твоя сортировка убога — актуально.

 

Это лучше, чем ничего. Если ты не в курсе, «группировка при выводе» предполагает сортировку по полю, по которому выполняется группировка. Перенос значений в ключи не особо помогает, т.к. значения в общем случае могут быть в многобайтной кодировке, поэтому для сортировки все равно потребуется сравнение с учетом «локали». Так что твоя «сортировка» такая же убогая.

 

Я вижу ты долго думал и надумал бред астральной фантазии, вместо того чтобы реализовал «Теорема ясности и пи3дешь на практике».
Ячейки со значениями нужно сгруппировать по одному из выбранных значений, где после твоей убогой сортировки не нужно будет использовать отслеживания изменений company. В Группировке ты сделаешь это РАЗ, после перечислишь лишь имена через запятую и перейдешь в группу самсунга и т.д.

 

Следовательно, для её решения, их нужно сгенерировать. То ли используя ключи корня вашего многомерного массива, то ли составить уникальные значения из имеющихся(например имя-компания-должность).
То, что это лабораторная, не отменяет наработку навыков. Без использования уникальных ключей, такая лабораторная, скорее навредит учебного процессу. К тому же, наверняка, ваш преподаватель, где-то о таком её решении упоминал.

 

Вывод так не работает:

PHP:
  1. <?php
  2. $user = [[‘name’ => «Oksana», ‘company’ => «ITStep», ‘position’ => «Teacher»],
  3.     [‘name’ => «Olesya», ‘company’ => «Samsung», ‘position’ => «Developer»],
  4.     [‘name’ => «Irina», ‘company’ => «ITStep», ‘position’ => «Teacher»],
  5.     [‘name’ => «Igor», ‘company’ => «Samsung», ‘position’ => «Developer»],
  6.     ];
  7.  
  8.     $output = [ ‘Samsung’ => [] , ‘ITStep’ => [] ];
  9. foreach($user as $value){
  10.   if ($value[‘company’] == ‘ITStep’)
  11.      $output[‘ITStep’][] = $value;
  12.   else
  13.     $output[‘Samsung’][] = $value;
  14. }
  15.  
  16. foreach($output as $key ){
  17.   $htmlConclusion .=  ‘<h2>’ . $key . ‘</h2>’;
  18.   foreach ($key as $value){
  19.     $htmlConclusion .=  ‘<h2>’ . $value . ‘</h2>’;
  20.     }
  21. }
  22. ?>
HTML:
  1. <div class=«container»>
  2.     <?= $htmlConclusion ?>
  3. </div>

На экране что-то вроде:

Array
Array
Array
Array
Array
Array

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *