За последние 24 часа нас посетили 22847 программистов и 1200 роботов. Сейчас ищут 635 программистов ...

Удалить элементы в многомерном массиве по количеству

Тема в разделе "PHP для новичков", создана пользователем alex.kot, 10 апр 2019.

Метки:
  1. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
    Добрый день.
    Столкнулся с такой проблемой, что не знаю как в массиве "books" выводить только по 1 элементу.

    PHP:
    1. (
    2.     [0] => Array
    3.         (
    4.             [id] => 1
    5.             [name] => Иван
    6.             [surname] => Иванов
    7.             [books] => Array
    8.                 (
    9.                     [0] => Array
    10.                         (
    11.                             [id] => 1
    12.                             [title] => Книга1
    13.                             [desc] => Описание1
    14.                             [author_id] => 1
    15.                         )
    16.  
    17.                     [1] => Array
    18.                         (
    19.                             [id] => 2
    20.                             [title] => Книга2
    21.                             [desc] => Описание2
    22.                             [author_id] => 1
    23.                         )
    24.  
    25.                     [2] => Array
    26.                         (
    27.                             [id] => 7
    28.                             [title] => Книга4
    29.                             [desc] => описание
    30.                             [author_id] => 1
    31.                         )
    32.  
    33.                 )
    34.  
    35.         )
    36.  
    37.     [1] => Array
    38.         (
    39.             [id] => 2
    40.             [name] => Александр
    41.             [surname] => Александров
    42.             [books] => Array
    43.                 (
    44.                     [0] => Array
    45.                         (
    46.                             [id] => 6
    47.                             [title] => Книга3
    48.                             [desc] => описание
    49.                             [author_id] => 2
    50.                         )
    51.  
    52.                     [1] => Array
    53.                         (
    54.                             [id] => 8
    55.                             [title] => Книга5
    56.                             [desc] => Книга5
    57.                             [author_id] => 2
    58.                         )
    59.  
    60.                 )
    61.  
    62.         )
    63.  
    64.     [2] => Array
    65.         (
    66.             [id] => 3
    67.             [name] => Володя
    68.             [surname] => описание
    69.             [books] => Array
    70.                 (
    71.                     [0] => Array
    72.                         (
    73.                             [id] => 9
    74.                             [title] => Книга6
    75.                             [desc] => Книга6
    76.                             [author_id] => 3
    77.                         )
    78.  
    79.                     [1] => Array
    80.                         (
    81.                             [id] => 10
    82.                             [title] => Книга7
    83.                             [desc] => Книга7
    84.                             [author_id] => 3
    85.                         )
    86.  
    87.                 )
    88.  
    89.         )
    90.  
    91. )
    В итоге должно получиться так:
    PHP:
    1. (
    2.     [0] => Array
    3.         (
    4.             [id] => 1
    5.             [name] => Иван
    6.             [surname] => Иванов
    7.             [books] => Array
    8.                 (
    9.                     [0] => Array
    10.                         (
    11.                             [id] => 1
    12.                             [title] => Книга1
    13.                             [desc] => Описание1
    14.                             [author_id] => 1
    15.                         )
    16.  
    17.                 )
    18.  
    19.         )
    20.  
    21.     [1] => Array
    22.         (
    23.             [id] => 2
    24.             [name] => Александр
    25.             [surname] => Александров
    26.             [books] => Array
    27.                 (
    28.                     [0] => Array
    29.                         (
    30.                             [id] => 6
    31.                             [title] => Книга3
    32.                             [desc] => описание
    33.                             [author_id] => 2
    34.                         )
    35.  
    36.                 )
    37.  
    38.         )
    39.  
    40.     [2] => Array
    41.         (
    42.             [id] => 3
    43.             [name] => Володя
    44.             [surname] => описание
    45.             [books] => Array
    46.                 (
    47.                     [0] => Array
    48.                         (
    49.                             [id] => 9
    50.                             [title] => Книга6
    51.                             [desc] => Книга6
    52.                             [author_id] => 3
    53.                         )
    54.  
    55.                 )
    56.  
    57.         )
    58.  
    59. )
    Пытался рекурсией сделать, ничего путного не получилось.
     
  2. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    из БД надо получать готовый массив, что бы не приходилось ничего удалять
     
  3. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
    К сожалению, не знаю и это как сделать.
    Вызываю просто так и все.
    Код (Text):
    1. Author::find()->with('books')->asArray()->all();
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    По какому условию по одному элементу? И это что, Yii2?
     
  5. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
    Получается что в books должен быть только один элемент.
    Да, Yii2.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Если нужно отобрать один элемент из 3, это делается по какому-нибудь условию. По какому в вашем случае? Вот Иван Иванов написал три книги, судя по вашему дампу, какую их них вы хотите отобрать?
     
  7. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
    Нужно оставить первую книгу у каждого автора.
    И по идее, чтоб это количество можно было менять, например первые два например.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Если просто первую, лично я бы плюнул, сколько их там в массиве, и выводил первую, игнорируя остальные. Ты же пользователю не дампы показывать будешь. Или задача именно так и звучит, чтоб в дампе осталась только одна книга автора, первая из добавленных? В таком случае надо мудрить, сразу не могу сказать
     
  9. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
    Нет, не обязательно первую из добавленных, можно любую, важно чтоб можно было изменять количество.
     
  10. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @alex.kot попробуй так:
    PHP:
    1. Author::find()->with('books')->limit(1)->asArray()->all();
    меняешь цифру в limit получаешь количество.И чтобы регулировать количество просто передавай в функцию эту цифру:
    PHP:
    1. public function getBook($num){
    2.    Author::find()->with('books')->limit($num)->asArray()->all();
    3. }
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    @Artur_hopf, и что ты делаешь? :) Ты получаешь одного автора со всеми его книгами :)
     
  12. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
    Да, а надо наоборот, всех авторов с одной книгой.:)
     
  13. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @mkramer у него же скорее всего две таблицы, один с автором другой с его книгами, вот когда к книгам человек прется надо задать limit 1 =), например:
    PHP:
    1. $userQuery = (new Query())->from('book')->limit(1)->all();
    2.  
    3. $query = new Query;
    4. $query->from('user');
    5. $query->leftjoin(['tb' => $userQuery], "user.id = tb.book");
    6. $result = $query->all();
    То есть я предполагаю когда он пишет with('books') он уже ищет книги. Или нет?
    --- Добавлено ---
    В общем надо искать в таблице с книгами через limit(1)
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Нет, просто указал жадно запросить связанные модели :)
     
  15. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @alex.kot напиши названия таблиц и названия столбцов с которыми связанны книги и автор. И конкретно написать запрос, это самый простой вариант я думаю.
     
  16. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
    Таблицы books и authors, authors.id = books.authors_id.
    Вот что показывает дебаггер http://prntscr.com/naeljl
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Ну да, всё правильно. Ограничить отбор строк по второму запросу можно только по какому-то признаку
     
  18. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
    Можно это по ключу сделать? Например оставить только те где ключ в books [0] и [1], а остальные удалить?
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    @alex.kot, нет, в базе никаких ключей массива нету. Можно только то, что реально подставить в приведённый where, к примеру, какую-нибудь дату добавления, ещё что-нибудь.

    И ещё раз, как звучит задача, которую ты пытаешься решить? И ты прочёл доку по Yii на русском языке?
     
  20. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
  21. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
    Я имел ввиду в массиве уже удалить эти элементы.
    Задача такая, "получить список авторов с первыми двумя книгами этих авторов".
    Да, читал, я хотел это решить таким образом, только как я понял жадная загрузка так не работает.

    PHP:
    1.         Author::find()->with([
    2.             'books' => function ($query) {
    3.                 $query->limit(2);
    4.             }
    5.         ])->asArray()->all();
     
  22. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @alex.kot, таблиц дамп дай.
    [​IMG]
     
  23. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
  24. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    @alex.kot, так да, не работает. Ты же видел в доке, какой запрос она генерирует. Первые две - по добавлению? Я бы просто флаги поставил у самих книг тогда. Хак, конечно, но эффективный. И тогда
    PHP:
    1. Author::find()->with([
    2.             'books' => function ($query) {
    3.                 $query->andWhere(["inFirsts" => 1]);
    4.             }
    5.         ])->asArray()->all();
    Или другой какой признак.
     
  25. alex.kot

    alex.kot Новичок

    С нами с:
    10 апр 2019
    Сообщения:
    23
    Симпатии:
    0
    Спасибо, хороший вариант, буду пробовать.