Помогите отсортировать массив! Я хочу вывести фильмы с определенным годом (пример ссылки index.php?type=movies&year=2005), мне нужно будет выводит и группировку по 1-му символу, и по определенному году(здесь 2 цикла)! Вот мой массив: PHP: Array ( [А] => Array ( [0] => Array ( [title] => Американский пирог [year] => 2005 ) [1] => Array ( [title] => Астрал [year] => 2005 ) [2] => Array ( [title] => Автор книги по ФИЛЬМАМ [year] => 2010 ) ) [Б] => Array ( [0] => Array ( [title] => Багратион [year] => 2005 ) ) [О] => Array ( [0] => Array ( [title] => Один дома [year] => 2001 ) [1] => Array ( [title] => Один дома 2 [year] => 2014 ) [2] => Array ( [title] => Овен [year] => 2014 ) ) [0-9] => Array ( [0] => Array ( [title] => 7 Джеймс Бонд [year] => 2007 ) [1] => Array ( [title] => 5 элемент [year] => 2011 ) ) [A-Z] => Array ( [0] => Array ( [title] => Good Movie [year] => 2003 ) [1] => Array ( [title] => Doom [year] => 2004 ) ) ) Нужно вывести с все фильмы 2005 года в таком формате: А Американский пирог (2005) Астрал (2005) Б Багратион (2005) А я на выходе получаю правильное значение фильмов, но только лишние категории, как отредактировать цикл? А Американский пирог (2005) Астрал (2005) Б Багратион (2005) О 0-9 A-Z Вот мой код: у меня неправильная логика в цикле! PHP: foreach($movies as $groups => $arr){ echo '<a href="index.php?type=movies&groups='.$groups.'">'.$groups.'</a><br/>'; foreach($arr as $value){ //Если $_GET['year'] равна $value['year'] if($_GET['year'] == $value['year']){ echo $value['title']. '<a href="index.php?type=movies&year='.$value['year'].'">('.$value['year'].')</a><br/>'; } } }
Добрый день! Вы не верно сформулировали задачу. Вам не нужно сортировать массив. Он уже как-то, пусть и страно, отсортирован. Вы написали: т.е. Вам нужно убрать пустые котегории при выводе списка. Попробуйте так: PHP: $noEmptyMoviesListe = []; foreach($movies as $groups => $arr){ foreach($arr as $value){ //Если $_GET['year'] равна $value['year'] if($_GET['year'] == $value['year']) $noEmptyMoviesListe[$groups][]=$value; } } if($noEmptyMoviesListe){ foreach($noEmptyMoviesListe as $groups => $arr){ echo "<a href=\"index.php?type=movies&groups=$groups\">$groups</a><br/>"; foreach($arr as $value) echo "{$value['title']} <a href=\"index.php?type=movies&year={$value['year']}\">({$value['year']})</a><br/>"; } } else echo "Не найдено ни одного фильма {$_GET['year']} года"; Удачи!
Сделал что то подобное, только по метках! Вот мой код: PHP: foreach($movies as $groups => $arr){ //Убирает метку, что бы сработал вывод следующей строки группы unset($nr); foreach($arr as $value){ //Если $_GET['year'] равна $value['year'] if($_GET['year'] == $value['year']){ //Вывод работает только если нету метки if(!isset($nr)){ //Это строка названия группы echo '<a href="index.php?type=movies&groups='.$groups.'">'.$groups.'</a><br/>'; //Метка что бы строка выводилась один раз $nr = true; } //Это строка названия и год выхода фильма echo $value['title']. '<a href="index.php?type=movies&year='.$value['year'].'">('.$value['year'].')</a><br/>'; } } }
Теперь возник 2-й вопрос (по поиску фильма), изначально была идея искать один фильм в массиве (по названию фильма), но возник вопрос (а если будет 2 фильма с одинаковыми названиями - но разными годами выхода фильмов, или 3 фильма), то мне нужно выводить результат! Мой код (с break) работает, если нужно выводить только 1 фильм, если 2 и больше, код не работает (потому что функция break)! PHP: foreach($movies as $arr){ foreach($arr as $value){ if($_POST['result'] == trim($value['title'])){ $result = $value['title'].'<a href="index.php?type=movies&year='.$value['year'].'">('.$value['year'].')</a>'; break(2); } else{ $result = 'Нет совпадений!'; } } } echo $result; Что бы этот поиск реализовать, мне нужно создать пустой массив (перед 1-м foreach), и уже во 2-м цикле сравнивать POST и $value, и заносить информацию в пустой массив, это все желательно реализовать (отдельная функция), и уже потом (новый массив) выводить в цикле (БОЛЬШЕ У МЕНЯ НЕТ ИДЕЙ - КАК ПРАВИЛЬНО ДЕЛАТЬ)! Но я не могу это реализовать в коде, если я убираю функцию break, то мне условие PHP: if($_POST['result'] == trim($value['title'])) всегда выдает PHP: $result = 'Нет совпадений!';
Добрый день! про Ваш код: А если по условию поиску ничего не выбрано, а Вы уже отправили HTML? Если $movies пустой, то будет фатальная ошибка в foreach. Добавил в Ваш массив Багратион, 2010 PHP: $movies = [ "А" => [ 0 => [ "title" => "Американский пирог", "year" => 2005 ], 1 => [ "title" => "Астрал", "year" => 2005 ], 2 => [ "title" => "Автор книги по ФИЛЬМАМ", "year" => 2010 ] ], "Б" => [ "0" => [ "title" => "Багратион", "year" => 2005 ], "1" => [ "title" => "Багратион", "year" => 2010 ] ], "О" => [ 0 => [ "title" => "Один дома", "year" => 2001 ], 1 => [ "title" => "Один дома 2", "year" => 2014 ], 2 => [ "title" => "Овен", "year" => 2014 ] ], "0-9" => [ 0 =>[ "title" => "7 Джеймс Бонд", "year" => 2007 ], 1 => [ "title" => "5 элемент", "year" => 2011 ] ], "A-Z" => [ 0 => [ "title" => "Good Movie", "year" => 2003 ], 1 => [ "title" => "Doom", "year" => 2004 ] ] ]; function getNoEmptyMoviesListe( $filterKey, $filterValue, $movies){ $noEmptyMoviesListe = []; foreach((array) $movies as $groups => $arr){ foreach($arr as $value){ if($value[$filterKey] == $filterValue) $noEmptyMoviesListe[$groups][]=$value; } } return $noEmptyMoviesListe; } $filterKey="year"; $filterValue = 2005; $noEmptyMoviesListe = getNoEmptyMoviesListe( $filterKey, $filterValue, $movies); if($noEmptyMoviesListe){ foreach($noEmptyMoviesListe as $groups => $arr){ echo "<a href=\"index.php?type=movies&groups=$groups\">$groups</a><br/>"; foreach($arr as $value) echo "{$value['title']} <a href=\"index.php?type=movies&year={$value['year']}\">({$value['year']})</a><br/>"; } } else echo "Поиск: $filterKey $filterValue. Не найдено ни одного фильма"; /* А Американский пирог (2005) Астрал (2005) Б Багратион (2005) */ $filterKey = "title"; $filterValue = "Багратион"; /* Б Багратион (2005) Багратион (2010) */ Удачи!
Дополнение PHP: function getNoEmptyMoviesListe( $filterKey, $filterValue, $movies){ $noEmptyMoviesListe = []; foreach((array) $movies as $groups => $arr){ foreach($arr as $value){ if($value[$filterKey] == $filterValue) $noEmptyMoviesListe[$groups][]=$value; } } return $noEmptyMoviesListe; } function viewLinks($inMovies){ if($inMovies){ foreach($inMovies as $groups => $arr){ echo "<a href=\"index.php?type=movies&groups=$groups\">$groups</a><br/>"; foreach($arr as $value) echo "{$value['title']} <a href=\"index.php?type=movies&year={$value['year']}\">({$value['year']})</a><br/>"; } } else echo "Поиск: $filterKey $filterValue. Не найдено ни одного фильма"; } $filterKey = "year"; $filterValue = 2005; if(preg_match("/(title|year)/",$filterKey) && $filterValue) viewLinks(getNoEmptyMoviesListe( $filterKey, $filterValue, $movies)); else viewLinks($movies);
Спасибо! Немного переписал ваш код, вот что получилось(создал 2 функции), добавил 2-й массив с мультфильмами: PHP: //Функция - узнаем цифру и её окончание (например) Найден(ы) 1 фильм(ы) function iResult($i){ switch($i){ case 1: $result = 'Найден '.$i.' кинокартина'; break; case 2: $result = 'Найдены '.$i.' кинокартины'; break; case 3: $result = 'Найдены '.$i.' кинокартины'; break; case 4: $result = 'Найдены '.$i.' кинокартины'; break; case 5: $result = 'Найдены '.$i.' кинокартин'; break; } return $result; } //Функция поиска на сайте function searchPost($post,$movies,$animations){ //Если ввели название фильма или мультфильма if(!empty($post)){ //Счетчик (количество найденных фильмов и мультфильмов) $i = 0; $result = null; //Приводит строку POST к нижнему регистру $post_title = mb_strtolower($post,'utf-8'); //Поиск фильма foreach($movies as $array){ foreach($array as $value){ //Приводит строку $value['title'] к нижнему регистру, удаляем пробелы $value_title = mb_strtolower(trim($value['title']),'utf-8'); //Если название введенного фильма совпадаем с фильмов в массиве if($post_title == $value_title){ //Добавляем счетчик +1 $i ++; //Записываем результат $result = $result.'<span>'.$value['title'].'<a href="index.php?type=movies&year='.$value['year'].'">('.$value['year'].')</a></span><br/>'; } } } //Поиск мультфильма foreach($animations as $array){ foreach($array as $value){ //Приводит строку $value['title'] к нижнему регистру, удаляем пробелы $value_title = mb_strtolower(trim($value['title']),'utf-8'); //Если название введенного фильма совпадаем с фильмов в массиве if($post_title == $value_title){ //Добавляем счетчик +1 $i ++; //Записываем результат $result = $result.'<span>'.$value['title'].'<a href="index.php?type=animations&year='.$value['year'].'">('.$value['year'].')</a></span><br/>'; } } } //Если фильмы или мультфильмы были найдены if(!empty($result)){ //Выводим результат поиска echo '<div class="search_result_title"><h5>'.iResult($i).':</h5>'.$result.'</div>'; } //Вдруг ничего не найдено else{ //Возвращаем false return 'false'; } } //Если не ввели название фильма или мультфильма else{ //Возвращаем null return 'null'; } } Вывод на странице: PHP: //Если не ввели название фильма или мультфильма if($search == 'null'){ //Выводим сообщение echo 'Введи название фильма или мультфильма!'; } else{ //Вдруг ничего не найдено if($search == 'false'){ //Выводим сообщение что нечего не найдено echo 'Нет совпадений!'; } else{ echo $search; } } Теперь не пойму, почему во 2-й функции return 'false'; и return 'null'; возвращает только в форме строки, если возвратить return false и return null, то у меня на выводе неправильно срабатывает условие if($search == null), только в формате строки срабатывает корректно if($search == 'null'), в чем может быть моя ошибка ?
Добрый день! В первой функции switch можно убрать PHP: function iResult($i){ switch($i){ case 1: $result = 'Найден '.$i.' кинокартина'; break; case 2: $result = 'Найдены '.$i.' кинокартины'; break; ... case 5: $result = 'Найдены '.$i.' кинокартин'; break; } return $result; } Тот же ресультат выдаст эта функция PHP: function iResult($i){ if($i==1) $result = "Найдена 1 кинокартина"; else if($i>1 AND $i<5) $result = "Найдены $i кинокартины"; else $result = "Найдено $i кинокартин" return $result; } По второй функции function searchPost($post,$movies,$animations){ 1. Повторяется два блока foreach($movies as $array){ foreach($animations as $array){ Лучше изменить параметры функции так function searchPost($post, $filmAnimation){ и оставить один блок foreach foreach($filmAnimation as $array){ и делать два вызова функции searchPost($post,$movies) searchPost($post,$animations) 2. тут ошибка PHP: if($post_title == $value_title){ //Добавляем счетчик +1 $i ++; //Записываем результат $result = $result.'<span>'.$value['title'].'<a href="index.php?type=movies&year='.$value['year'].'">('.$value['year'].')</a></span><br/>'; } Счетчик наращивается, а $result нет. Функция будет возвращать толко одну остроку. 3. Функция должна возвращать строку, а не null или false Вывод результата PHP: //Если не ввели название фильма или мультфильма if(empty($post)){ //Выводим сообщение echo 'Введи название фильма или мультфильма!'; } else if($search;) echo $search; else{ //Выводим сообщение что нечего не найдено echo 'Нет совпадений!'; } Удачи!