За последние 24 часа нас посетил 22661 программист и 1281 робот. Сейчас ищут 782 программиста ...

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

Тема в разделе "PHP для новичков", создана пользователем south, 25 ноя 2022.

  1. south

    south Новичок

    С нами с:
    25 окт 2022
    Сообщения:
    13
    Симпатии:
    0
    Доброго времени суток уважаемые форумчане! В 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.  

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    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. south

    south Новичок

    С нами с:
    25 окт 2022
    Сообщения:
    13
    Симпатии:
    0
    Говорит - синтаксическая ошибка в строке 3. (тут она 3)
     
  4. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    PHP:
    1.     $htmlConclusion ='' ;
    2.         foreach ($user as $value) {
    3.                 $htmlConclusion .= '<h2 class="">'. $value['company'] .' '.$value['name'].' '.$value['position'].'</h2>';
    4.             }
    5. print($htmlConclusion);
     
  5. south

    south Новичок

    С нами с:
    25 окт 2022
    Сообщения:
    13
    Симпатии:
    0
    Не, он тут получается не сортирует. Нужно чтоб Оксана с Ириной были в ITStep, а Олеся в Самсунге.
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Сортировка – это одно, а показанный вывод – другое.

    Сортировка:
    PHP:
    1. usort($user, fn($a, $b) => $a['company'] <=> $b['company']);
    Для вывода отслеживайте изменение значения company в смежных «записях» после сортировки по company (при появлении нового значения выводите его).
     
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Начнем с того, что в этом списке нет уникального ID сотрудника. Или вы его туда не включили.
    Иначе, при группировке этого списка, часть сотрудников будет потеряна. Если они будут иметь одинаковые имена например.
    Поэтому-то у вас с этим списком затруднения и возникли. Как только добавите ID, так сразу и разберетесь.
    Ну, может и не сразу.
     
  8. south

    south Новичок

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

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Тебе нужно сформировать другой массив на основе данного. Первым ключом у него будет 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. }
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Во первых - автору нужна не сортировка, а группировка по компаниям и далее вывод.
    Во вторых

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

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Можешь считать такими ID индексы основного массива, если без них никак ;)
    --- Добавлено ---
    Про ID я в общем-то согласен, причем не только сотрудника, но и компании, однако к делу это не относится, т.к. это учебная задачка, что ТС подтвердил.
    --- Добавлено ---
    Автору нужна группировка при выводе, так что просто сортировать «записи» в качестве осн. действия более чем норм.
     
    #11 miketomlin, 26 ноя 2022
    Последнее редактирование: 26 ноя 2022
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    ты сам понял что написал ? Тебе сначала надо сгруппировать данные - это 1 действие, только после будешь выводить. Какая сортировка тут ? сортировка чего ? зачем ? o_O
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Странно, что ты не понял. Хотя нет, не странно :D
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    давай сюда код со своей сортировкой и выводом от А до Я. Я тебя разнесу сейчас.
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    См. выше. Вывод описан словами, если не понятно :)
    --- Добавлено ---
    Это обычная «группировка при выводе», так что было лень код писать. Пусть ТС хоть немного потрудится.
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Я не вижу код твоего примера. Твоя сортировка убога - актуально.
     
  17. miketomlin

    miketomlin Старожил

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Я вижу ты долго думал и надумал бред астральной фантазии, вместо того чтобы реализовал "Теорема ясности и пи3дешь на практике".
    Ячейки со значениями нужно сгруппировать по одному из выбранных значений, где после твоей убогой сортировки не нужно будет использовать отслеживания изменений company. В Группировке ты сделаешь это РАЗ, после перечислишь лишь имена через запятую и перейдешь в группу самсунга и т.д.


     
  19. Drunkenmunky

    Drunkenmunky Активный пользователь

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

    south Новичок

    С нами с:
    25 окт 2022
    Сообщения:
    13
    Симпатии:
    0
    Вывод так не работает:

    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
     
  21. rr33rr

    rr33rr Новичок

    С нами с:
    6 май 2021
    Сообщения:
    33
    Симпатии:
    18
    Например, как-то так
    PHP:
    1. <?php
    2. $user = [
    3.     ['name' => "Oksana", 'company' => "ITStep", 'position' => "Teacher"],
    4.     ['name' => "Olesya", 'company' => "Samsung", 'position' => "Developer"],
    5.     ['name' => "Irina", 'company' => "ITStep", 'position' => "Teacher"]
    6. ];
    7.  
    8. foreach ($user as $usr) {
    9.     $company_users[$usr['company']][] = $usr['name'];
    10. }
    11. foreach ($company_users as $company=>$users) {
    12.     echo "<b>$company</b>\n";
    13.     echo "<ul>\n";
    14.     foreach ($users as $user_name) {
    15.         echo "<li>$user_name</li>\n";
    16.     }
    17.     echo "</ul>\n";
    18. }
    19. ?>
     
  22. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Нет, это еще одна элементарная вещь, которую тебе постичь не дано.
    --- Добавлено ---
    Что тебе не понятно в моем первом посте? Показанная сортировка плюс один цикл вывода (в начале цикла ветвление для вывода названий компаний).
     
  23. south

    south Новичок

    С нами с:
    25 окт 2022
    Сообщения:
    13
    Симпатии:
    0
    Теоретически всё понятно, мы пытаемся сортировать массив по значениям с помощью usort, и потом вывести использую цикл. Но на практике не получается, я запутался в синтаксисе.
    Как только я ввожу вот это:
    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.     usort($user, fn($a, $b) => $a['company'] <=> $b['company']);
    6. ?>
    Он уже ругается на синтаксис, я еще даже до цикла не дошел. Строка 5 применительно к моей задачи записывается как-то иначе? или я чего-то не понимаю?
    --- Добавлено ---
     
  24. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Может версия php не поддерживает сие?
    А в моем варианте надо действительно делать вывод по-другому.
    Перепиши стрелочную функцию.
     
    #24 antoniii, 27 ноя 2022
    Последнее редактирование: 27 ноя 2022
  25. south

    south Новичок

    С нами с:
    25 окт 2022
    Сообщения:
    13
    Симпатии:
    0
    Current PHP version: 7.2.34