Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 21.04.2018 10:56:43

Как в результирующей коллекции пропустить некоторые элементы

Всем привет!

В Laravel 5.6 разбираясь с коллекциями  https://laravel.ru/docs/v5/collections
не нашел а можно ли в результирующей коллекции пропустить некоторые элементы, вроде :

               $aliasArray        = ['contact_us','tdes_quiz', 'NONE', 'NO'];

                $collection = collect($aliasArray)->map(function ($next_alias) {
                    echo '<pre>$next_alias::'.print_r($next_alias,true).'</pre>';
                    if (empty($next_alias)) {
//                        SKIP;
                    }
                    $cmsItemContent = CmsItem::getBodyContentByAlias($next_alias, ['show_song_name' => 1]);
                    if ($cmsItemContent !== null) {
//                        SKIP;
                    }

                    return $cmsItemContent;
                });
//                $collection = $collection->where('ID IS SET', 100);
//                $collection->all();
            }

Сейчас  в collection 2 последних элемента имеют значение false.

Их никак пропустить не можно ?
Я пытался использовать where после цикла - но непонятно как если елемент имеет значение false.

Можно ли и как?

Спасибо !

Не в сети

#2 21.04.2018 12:54:15

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Как в результирующей коллекции пропустить некоторые элементы

Немного непонял вопроса, но может in_array поможет?

Не в сети

#3 21.04.2018 13:26:53

Re: Как в результирующей коллекции пропустить некоторые элементы

Про in_array я в курсе Для меня привычно если нужно выбрать из данных часть набора делать что-то вроде:

            $dataArray= [];
            foreach( $artistConcertsList as $next_key=>$nextArtistConcert ) {
                if ( in_array($nextArtistConcert['event_date_is_past'], [ 'is_today', 'is_tomorrow', 'is_future' ]) ) {
                    $dataArray[]= $nextArtistConcert;
                }
            }

То есть часть данных удаляется Можно лим сделать так и для  коллекций?
Коллекции - это вроде как более прогрессивно чем старые циклы ?

Не в сети

#4 21.04.2018 16:03:30

Re: Как в результирующей коллекции пропустить некоторые элементы

Фильтр делают через Collection::filter() или Collection::where()

PHP
$filtered $collection->filter(function ($value$key) {
    return 
$value 2;
});

Но только пожалуйста,

1) не делай два дела сразу: фильтрацию и вывод через echo. враги php называют это «php mess» )))
2) не делай collect($aliasArray)->filter(…), раз уж у тебя на входе массив, фильтруй его через array_filter(), так будет гораздо эффективнее. Результат уже заверни в collection(), если еще не передумаешь.

  1. Коллекции — это вроде как более прогрессивно чем старые циклы?

это на 100% зависит от использующего ;)

10 less known but awesome laravel collections methods
array_filter

Изменено artoodetoo (21.04.2018 16:08:51)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#5 23.04.2018 15:37:56

Re: Как в результирующей коллекции пропустить некоторые элементы

Спасибо, но видимо к коллекциям нужно привыкнуть...
Хочу сделать сортировку по среднему из 2х полей, где tempmostRatingArtistsList - коллекция из данных базы:

            $mostRatingArtistsList= $tempmostRatingArtistsList->sort(function ($a, $b) {
                if ( empty($a->related_votes_count) or empty($b->related_votes_count)) return 0;
                $a_rating= floor($a->related_votes_sum / $a->related_votes_count);
                $b_rating= floor($b->related_votes_sum / $b->related_votes_count);
                if ( $a_rating == $b_rating ) {
                    return 0;
                }
                return ($a_rating < $b_rating) ? -1 : 1;
            });

Судя по описанию метод sort это обертка для uasort -  и вроде логика правильна
Но выходные данные в mostRatingArtistsList неотсортированные...
Или неправильное опеределение выше ?

Не в сети

#6 23.04.2018 16:12:39

Re: Как в результирующей коллекции пропустить некоторые элементы

if ( empty($a->related_votes_count) or empty($b->related_votes_count)) return 0;

ИМХО, эта строка всё портит.
переделай так, чтобы пустой count обнулял соответствующий рейтинг. сейчас ты делаешь его равным любому другому рейтингу smile это ошибка.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

Подвал раздела