Проверка, содержит ли массив те же ключ и значение, что и другой массив, который повторяется. PHP

#php #arrays #laravel-5 #arrayobject

#php #массивы #laravel-5 #arrayobject

Вопрос:

Прежде всего, фреймворк, который я использую, — Laravel 5.3

Чего я пытаюсь достичь, так это найти способ минимизировать запрос в моем приложении. Я работаю над веб-панелью управления рестораном, в представлении которой я должен редактировать список блюд из соответствующих категорий, назначенных для ежедневного специального меню. Предварительный просмотр представления показан ниже:

введите описание изображения здесь

У меня есть два запроса, которые после некоторой работы, проделанной над их результатами, генерируют каждый отдельный массив.

Первый массив с именем : $selectable_categories_and_dishes возвращает массив всех категорий и блюд в базе данных (сюда входят категории и соответствующие блюда, которые уже выбраны).

Объекты и структура массива:

 {
  "id_category":4,
  "category_name":"Contorno ",
  "dishes":[
            {
             "id":15,
             "price":"10",
             "name":"Patate al Forno"
            },
            {
             "id":16,
             "price":
             "8","name":"Verdure alla Griglia"
            },
            {
             "id":17,
             "price":"8",
             "name":"Insalata Mista"
            }
          ],
}
  

Второй массив с именем : $selected_categories_and_dishes
возвращает массив всех категорий и блюд, которые были выбраны при создании ежедневного специального меню в первую очередь.
Объекты и структура массива:

 {
  "id_category":4,
  "category_name":"Contorno ",
  "dishes":[
            {
             "id":15,
             "price":"10",
             "name":"Patate al Forno",
             "id_pcm":"4"
            },
            {
             "id":16,
             "price":"8",
             "name":"Verdure alla Griglia",
             "id_pcm":"4"
            },
            {
             "id":17,
             "price":"8",
             "name":"Insalata Mista",
             "id_pcm":"4"
            }
          ],
}
  

Чего я не могу понять, так это способа объединить эти массивы вместе таким образом, чтобы при циклическом просмотре объединенного массива проверялись все выбранные блюда.

Как я могу это сделать?

Редактировать:

Способ, которым я генерирую этот идентификатор массива, заключается в следующем:

  $menu_categories = DB::select('SELECT id , name FROM `packages_menu_categories` WHERE visible = "yes" AND `delete` = "no"');
        $selectable_categories_and_dishes = array();
        foreach ($menu_categories as $menu_category)
        {
            $dishes =  DB::select('SELECT d.id , d.price , d.name FROM `package_menu_categories_dishes` p LEFT JOIN `dishes` d ON p.id_dish = d.id WHERE p.visible = "yes" AND p.delete = "no" AND p.id_package_menu_category ='.$menu_category->id);
            $object=
                [
                    'id_category' => $menu_category->id,
                    'category_name' =>$menu_category->name,
                    'dishes' => $dishes
                ];

            array_push($selectable_categories_and_dishes,$object);
        }

        $selected_categories = DB::select('SELECT c.id as id_category , c.name as category_name FROM sub_packages_dishes s LEFT JOIN packages_menu_categories c ON s.id_package_menu_category = c.id WHERE s.id_sub_package = '.$id.' GROUP BY s.id_package_menu_category');
        $dishes_and_categories  = array();
        foreach ($selected_categories as $selected_category)
        {
            $dishes =  DB::select('SELECT s.id AS id_pmcd , d.id , d.name FROM `sub_packages_dishes` s LEFT JOIN `dishes` d ON s.id_dish = d.id WHERE s.id_sub_package ='.$id.' AND s.id_package_menu_category ='.$selected_category->id_category);
            $object=
                [
                    'id_category' => $selected_category->id_category,
                    'category_name' =>$selected_category->category_name,
                    'dishes' => $dishes
                ];
            array_push($dishes_and_categories,$object);
        }
  

Комментарии:

1. Можете ли вы привести пример того, как должен выглядеть желаемый массив?

2. Мое предложение, предполагающее, что вы можете управлять структурой массива, заключается в том, чтобы использовать dishes в качестве идентификатора блюда associative array и key в качестве идентификатора блюда. Затем, когда вы выполняете цикл, проверьте, существует ли тот, в котором вы находитесь, в выбранном.

3. Массив может выглядеть примерно так, как указано выше, но с флагом внутри массива объектов dishes, например: { «id»: 17, «price»: «8», «name»: «Insalata Mista», «id_pcm»: «4», «checked»:»1″ } @simon

4. @nerdlyist это тоже хорошая идея… Я попробую это и дам вам знать .. спасибо

5. @nerdlyist это был правильный путь .. оказывается, это намного проще, чем я думал. Отправьте свой комментарий в качестве ответа, чтобы я мог пометить его как один. Большое спасибо.

Ответ №1:

Мое предложение, предполагающее, что вы можете управлять структурой массива, состоит в том, чтобы сделать dishes ассоциативным массивом, а ключ — идентификатором блюда. Затем по мере выполнения цикла проверьте, существует ли тот, в котором вы находитесь, в выбранном

По сути, это была бы структура:

 {
"id_category":4,
"category_name":"Contorno ",
"dishes":{
    15 => {
        "price":"10",
        "name":"Patate al Forno",
        "id_pcm":"4"
    },
    16 => {
        "price":"8",
        "name":"Verdure alla Griglia",
        "id_pcm":"4"
    }
    ...
}
  

Затем, когда вы зацикливаете свой массив, это так просто, как. Это может быть не на 100%, но передает суть.

 foreach($selectable_categories_and_dishes as $key => $values){
    if(isset($selected_categories['dishes'][$key])){
        //This is selected so check the box. 
    }
}