Доброго времени суток уважаемые форумчане! В php имеется массив, состоящий из трёх элементов. Каждый элемент имеет структуру: name, company, position. Это (условный) список сотрудников, который содержит их имена, компанию в которой они работают и должность. Мне нужно вывести список и отсортировать его в зависимости от компании, грубо говоря, чтоб на экране было что-то похожее: - ITStep - Oksana - Irina - Samsung - Olesya Вот мой код: PHP: <?php $user = [['name' => "Oksana", 'company' => "ITStep", 'position' => "Teacher"], ['name' => "Olesya", 'company' => "Samsung", 'position' => "Developer"], ['name' => "Irina", 'company' => "ITStep", 'position' => "Teacher"], ]; $htmlConclusion = '<h2 class="">'; foreach ($user as $key => $category) { foreach ($category as $name => $value) { $htmlConclusion .= '<h2>' . $value . '</h2>'; } } ?> HTML: <div class="container"> <?= $htmlConclusion ?> </div> Помогите пожалуйста разобраться.
PHP: <?php function group( array $array, int | string | null $column ): iterable { $all = []; foreach ( $array AS $row ) { $all[ ( isset ( $row[$column] ) || array_key_exists ( $column, $row ) ? $row[$column] : reset ( $row ) ) ][] = $row; } return $all; } print_r ( group( array, company ) );
PHP: $htmlConclusion ='' ; foreach ($user as $value) { $htmlConclusion .= '<h2 class="">'. $value['company'] .' '.$value['name'].' '.$value['position'].'</h2>'; } print($htmlConclusion);
Сортировка – это одно, а показанный вывод – другое. Сортировка: PHP: usort($user, fn($a, $b) => $a['company'] <=> $b['company']); Для вывода отслеживайте изменение значения company в смежных «записях» после сортировки по company (при появлении нового значения выводите его).
Начнем с того, что в этом списке нет уникального ID сотрудника. Или вы его туда не включили. Иначе, при группировке этого списка, часть сотрудников будет потеряна. Если они будут иметь одинаковые имена например. Поэтому-то у вас с этим списком затруднения и возникли. Как только добавите ID, так сразу и разберетесь. Ну, может и не сразу.
Это лабораторная, по условиям задачки нет id. В учебных целях, самое начало изучения php. Тут наверное предполагается что не будет одинаковых имен За подсказку всё равно спасибо!
Тебе нужно сформировать другой массив на основе данного. Первым ключом у него будет company а вторым имя. В цикле перебирая первоначальный массив добавляем: Код (Text): $output = [ 'Samsung' => [] , 'ITStep' => [] ]; foreach($user as $value){ if ($value['company'] == 'ITStep') $output['ITStep'][] = $value; else $output['Samsung'][] = $value; } //а потом вывести массив $output foreach($output as $key ){ echo $key . '<br>'; foreach ($key as $value){ echo $value. '<br>'; } }
Во первых - автору нужна не сортировка, а группировка по компаниям и далее вывод. Во вторых обновись, динозавров не поддерживаю
Можешь считать такими ID индексы основного массива, если без них никак --- Добавлено --- Про ID я в общем-то согласен, причем не только сотрудника, но и компании, однако к делу это не относится, т.к. это учебная задачка, что ТС подтвердил. --- Добавлено --- Автору нужна группировка при выводе, так что просто сортировать «записи» в качестве осн. действия более чем норм.
ты сам понял что написал ? Тебе сначала надо сгруппировать данные - это 1 действие, только после будешь выводить. Какая сортировка тут ? сортировка чего ? зачем ?
См. выше. Вывод описан словами, если не понятно --- Добавлено --- Это обычная «группировка при выводе», так что было лень код писать. Пусть ТС хоть немного потрудится.
Это лучше, чем ничего. Если ты не в курсе, «группировка при выводе» предполагает сортировку по полю, по которому выполняется группировка. Перенос значений в ключи не особо помогает, т.к. значения в общем случае могут быть в многобайтной кодировке, поэтому для сортировки все равно потребуется сравнение с учетом «локали». Так что твоя «сортировка» такая же убогая.
Я вижу ты долго думал и надумал бред астральной фантазии, вместо того чтобы реализовал "Теорема ясности и пи3дешь на практике". Ячейки со значениями нужно сгруппировать по одному из выбранных значений, где после твоей убогой сортировки не нужно будет использовать отслеживания изменений company. В Группировке ты сделаешь это РАЗ, после перечислишь лишь имена через запятую и перейдешь в группу самсунга и т.д.
Следовательно, для её решения, их нужно сгенерировать. То ли используя ключи корня вашего многомерного массива, то ли составить уникальные значения из имеющихся(например имя-компания-должность). То, что это лабораторная, не отменяет наработку навыков. Без использования уникальных ключей, такая лабораторная, скорее навредит учебного процессу. К тому же, наверняка, ваш преподаватель, где-то о таком её решении упоминал.
Вывод так не работает: PHP: <?php $user = [['name' => "Oksana", 'company' => "ITStep", 'position' => "Teacher"], ['name' => "Olesya", 'company' => "Samsung", 'position' => "Developer"], ['name' => "Irina", 'company' => "ITStep", 'position' => "Teacher"], ['name' => "Igor", 'company' => "Samsung", 'position' => "Developer"], ]; $output = [ 'Samsung' => [] , 'ITStep' => [] ]; foreach($user as $value){ if ($value['company'] == 'ITStep') $output['ITStep'][] = $value; else $output['Samsung'][] = $value; } foreach($output as $key ){ $htmlConclusion .= '<h2>' . $key . '</h2>'; foreach ($key as $value){ $htmlConclusion .= '<h2>' . $value . '</h2>'; } } ?> HTML: <div class="container"> <?= $htmlConclusion ?> </div> На экране что-то вроде: Array Array Array Array Array Array
Например, как-то так PHP: <?php $user = [ ['name' => "Oksana", 'company' => "ITStep", 'position' => "Teacher"], ['name' => "Olesya", 'company' => "Samsung", 'position' => "Developer"], ['name' => "Irina", 'company' => "ITStep", 'position' => "Teacher"] ]; foreach ($user as $usr) { $company_users[$usr['company']][] = $usr['name']; } foreach ($company_users as $company=>$users) { echo "<b>$company</b>\n"; echo "<ul>\n"; foreach ($users as $user_name) { echo "<li>$user_name</li>\n"; } echo "</ul>\n"; } ?>
Нет, это еще одна элементарная вещь, которую тебе постичь не дано. --- Добавлено --- Что тебе не понятно в моем первом посте? Показанная сортировка плюс один цикл вывода (в начале цикла ветвление для вывода названий компаний).
Теоретически всё понятно, мы пытаемся сортировать массив по значениям с помощью usort, и потом вывести использую цикл. Но на практике не получается, я запутался в синтаксисе. Как только я ввожу вот это: PHP: <?php $user = [['name' => "Oksana", 'company' => "ITStep", 'position' => "Teacher"], ['name' => "Olesya", 'company' => "Samsung", 'position' => "Developer"], ['name' => "Irina", 'company' => "ITStep", 'position' => "Teacher"],]; usort($user, fn($a, $b) => $a['company'] <=> $b['company']); ?> Он уже ругается на синтаксис, я еще даже до цикла не дошел. Строка 5 применительно к моей задачи записывается как-то иначе? или я чего-то не понимаю? --- Добавлено ---
Может версия php не поддерживает сие? А в моем варианте надо действительно делать вывод по-другому. Перепиши стрелочную функцию.