2014-10-06 5 views
1

Я реорганизую приложение для календарей. В календаре есть пользовательская сетка (слоты, в которых могут выполняться заказы), но также необходимо отображать заказы «вне сети». Подумайте о «обычных» слотах в 08:00, 09:00 и «нерегулярных» слотах, когда кто-то забронирован в 08:39. По бизнес-причинам мне нужно отображать эти слоты по-разному (CSS), иначе они будут вести себя одинаково. Я искал Руководство по PHP, но встроенные функции массива не выполняют именно то, что мне нужно.Объединение двумерных массивов в группы

$officialGrid = array(
    array('grid' => TRUE, 'time' => '08:00', 'content' => NULL), 
    array('grid' => TRUE, 'time' => '09:00', 'content' => NULL)); 

$bookings = array(
    array('grid' => NULL, 'time' => '08:00', 'content' => 'Paul Simon'), 
    array('grid' => NULL, 'time' => '08:00', 'content' => 'Art Garfunkel'), 
    array('grid' => NULL, 'time' => '08:39', 'content' => 'Homer J. Simpson')); 

Я мог бы просто добавить эти массивы, но по производительности причинам хотели бы сократить результат:

$timeSlotsToDisplay = array(
    array('grid' => TRUE, 'time' => '08:00', 'content' => 'Paul Simon, Art Garfunkel'), //regular 
    array('grid' => NULL, 'time' => '08:39', 'content' => 'Homer J. Simpson'), //irregular 
    array('grid' => TRUE, 'time' => '09:00', 'content' => NULL)); //vacant 

Я также гибко изменять типы данных для значений (content может быть массивом). Есть ли элегантное решение для слияния этих массивов, кроме начала цикла и сравнения?

PS: Просто для иллюстрации в терминах PostgreSQL мне нужно SELECT DISTINCT ON (time) grid, time, string_agg(content) FROM myDB GROUP BY time ORDER BY time, grid; (пожалуйста, игнорируйте возможные ключевые слова, не цитируя из-за форматирования, также не опробовали запрос).

+0

Не то, чтобы я знал. петли не злые, хотя ... – Steve

+1

Лучше иметь время как ключи (для официальногоGrid) – Cheery

ответ

2

Я не вижу ничего плохого с петлями .. но я предлагаю другую структуру для $officialGrid массива

$officialGrid = array(
    '08:00' => array('grid' => TRUE, 'content' => NULL), 
    '09:00' => array('grid' => TRUE, 'content' => NULL)); 

$bookings = array(
    array('grid' => NULL, 'time' => '08:00', 'content' => 'Paul Simon'), 
    array('grid' => NULL, 'time' => '08:00', 'content' => 'Art Garfunkel'), 
    array('grid' => NULL, 'time' => '08:39', 'content' => 'Homer J. Simpson')); 

$timeSlotsToDisplay = $officialGrid; 

array_map(function($el) use(&$timeSlotsToDisplay, $officialGrid) { 
    $timeSlotsToDisplay[$el['time']] = array(
    'content' => 
     (isset($timeSlotsToDisplay[$el['time']]) ? 
     trim($timeSlotsToDisplay[$el['time']]['content'], ',') . ',' : '') . 
     $el['content'], 
    'grid' => isset($officialGrid[$el['time']]) ? true : null 
    ); 
}, $bookings); 

ksort($timeSlotsToDisplay); 
var_dump($timeSlotsToDisplay); 

array_map может быть заменен одной foreach петли.

0

«Я искал Руководство по PHP, но встроенные функции массива не выполняют , что мне нужно».

Встроенные в массивы функций являются более эффективными, чем просто перекручивание через кучу массивов, вы должны смотреть на array_merge и array_merge_recursive в PHP для более эффективного ответа, как это сделать, или делать это в качестве информации сбрасывается из базы данных с помощью SQL.

Что касается практического php-решения, возможно, если бы вы могли прокручивать каждую строку в каждом массиве 2d и принимать требуемую информацию, однако это предполагает, что ключи каждого массива в $ officialGrid структурированы так же, как ключи каждого массива в $ bookings. Он должен зацикливать и сопоставлять данные, в которых они совпадают с «временем», и пропускать те, которые не соответствуют друг другу. В зависимости от того, сколько строк информации у вас есть петли, можно использовать массивы, но они далеки от оптимальных.

$officialGrid = Array(
     Array('grid' => TRUE, 'time' => '08:00' // ... arrays assumed to be populated with example data above 

    $bookings = Array(
     Array('grid' => NULL, 'time' => '08:00' // ... arrays assumed to be populated with example data above 

    // fill final array with content from $bookings 
    $timeSlotsToDisplay = $bookings; 


    foreach($officialGrid as $officalkey=>$officalobj) { 
     foreach($timeSlotsToDisplay as $bookkey=>$obj) { 
      if(!isset($officialGrid[$officalobj['time']]) || !isset($timeSlotsToDisplay[$bookobj['time']])) { 
       //one of them is not set.. error 
      } 

       //if the times match when looping 
      if($officialGrid[$officalobj['time']] == $timeSlotsToDisplay[$bookobj['time']]) { 
       //keeps the information from officialgrid data for column, and keep $booking data for content column 
      //the null grid entries will just stay the same, as $bookings oringally had 
       $timeSlotsToDisplay[$officalobj['grid']]; 
       $timeSlotsToDisplay[$bookobj['time']] 
       $timeSlotsToDisplay[$bookobj['content']]; 
      } 
     } 
    } 
+0

@downvoter, позаботьтесь прокомментировать? – PeerBr

Смежные вопросы