2016-02-19 4 views
0

UPDATE: После ответов я получил, я понял, что я Шоуда пытается решить эту проблему уже с запросом к базе данных, так что я написал a more detailed post hereСравнение двух многомерных массивов и неустановленные соответствующие элементы

ОРИГИНАЛЬНЫЙ ПОСТ: Я бы как сравнить два многомерных массива и избавиться от элементов, которые соответствуют определенным критериям. Я знаю, что мне придется перебирать массивы с помощью некоторых клавиш, а затем отключать, но я не могу сделать это правильно.

Два массива: $all, в котором хранятся все доступные комнаты и их кровати и $reserved, в которых зарезервированы только зарезервированные комнаты и зарезервированные кровати.

Я хочу пройти через все оговорки и взять название комнаты, которое находится в позиции $reservations[x][0], где x - просматриваемая в данный момент резервирование, и сравнить ее со всеми элементами в $all[a][0], где находится просматриваемая в данный момент комната.

Итак, когда я нахожу, что значение $all[0][0] => «Luxury Room» совпадает с $reservations[0][0] => «Luxury Room» Я буду смотреть на кровати и код кровати на позиции у где у текущего рассматривается код $reservations[x][1][y] кровать и сравните его со всеми доступными кроватями для подходящей комнаты, поэтому с $all[0][1][b], где b - все доступные номера.

И когда я узнаю, что значение $all[0][1][1] => «ХХ2» соответствует значению в $reservations[0][1][0] => «ХХ2» Я буду незадан индекс 01 из $all

так, наконец, когда я буду цикл через $all массив и было бы перечислить индекс каждого элемента [0] в качестве заголовка и элементов массива по индексу 1 как кровати, я бы только получить кровать «xx2» как доступные «Luxury Room»

//$all is an array where index 0 is an array 
$all = array(0=>array(
        //index 0 has value 'Luxury Room' (room title) 
        0=>'Luxury Room', 
        //index 1 is an array 
        1=>array(
          //where index 0 has value 'xx1' (bed code) 
          0=>'xx1', 
          //where index 1 has value 'xx2' (bed code) 
          1=>'xx2')), 
      //again index 1 is an array etc. just as above... 
      1=>array(
        0=>'Cheap Room', 
        1=>array(
          0=>'zz1', 
          1=>'zz2', 
          2=>'zz3', 
          3=>'zz4'))); 

$reserved = array(0=>array(
        0=>'Luxury Room', 
        1=>array(0=>'xx2'))); 
+0

Есть ли способ сделать это с помощью соответствующих запросов к базе данных вместо борьбы с этим чудовищем? Просто любопытно. –

+0

Может быть, но я не дошел так далеко, как с этой идеей. В основном у меня есть столовые, в которых есть ID и BEDS, с общим количеством кроватей. Таким образом, я хотел преобразовать это через цикл в этот простой массив, потому что в конце концов все, что мне нужно, это доступные идентификаторы комнат с их доступными кроватями. Вторая таблица - это оговорки, в которых есть FROM (дата), TO (дата), ROOMS_ID (int) и BED_NUMBER (int) –

+0

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

ответ

1

использование вложенных циклов:

foreach ($all as &$room) { 
    foreach ($reserved as $r) { 
     if ($room[0] == $r[0]) { // same types of room 
      foreach ($room[1] as $i => $code) { 
       if (in_array($code, $r[1])) { 
        unset($room[1][$i]); 
       } 
      } 
     } 
    } 
    $room[1] = array_values($room[1]); // Reset array indexes 
} 

$all цикла использует ссылку для итерационных переменного, так что unset() вызовов изменить исходный массив.

DEMO

+0

Это абсолютно правильно и то, что я пытался делать все это время. Теперь я знаю, что этого будет недостаточно, потому что я все еще должен иметь только неустановленные комнаты с кроватями, зарезервированными на все дни, за которые человек пытается сделать оговорку. Поэтому я снова начинаю с запроса. –