8

Ho questa matrice:Come posso unire sottoserie consecutive che contengono gli stessi dati?

$opening_hours = array(
    'Monday' => array('09:00', '17:00'), 
    'Tuesday' => array('09:00', '17:00'), 
    'Wednesday' => array('08:00', '13:00'), 
    'Thursday' => array('09:00', '17:00'), 
    'Friday' => array('09:00', '17:00'), 
    'Saturday' => array('10:00', '16:00'), 
    'Sunday' => array('Closed'), 
); 

ho bisogno di unire in qualche modo quelle ore di apertura alla matrice che dovrebbe assomigliare a questo:

$merged_opening_hours = array(
    'Monday - Tuesday' => array('09:00', '17:00'), 
    'Wednesday' => array('08:00', '13:00'), 
    'Thursday - Friday' => array('09:00', '17:00'), 
    'Saturday' => array('10:00', '16:00'); 
    'Sunday' => array('Closed'), 
); 

Tutte le idee?

+0

@FrancescoAbeni Ho provato a scorrere $ opening_hours array e io ero controllando se l'elemento successivo di un array è uguale a quello corrente, ma in qualche modo questo non ha funzionato. Rizier123 ha fatto esattamente quello che mi serve con la spiegazione. – David

risposta

7

Questo dovrebbe funzionare per voi:

Quindi, in pratica basta scorrere l'intero array e controllare se l'elemento successivo è ancora impostato e l'array corrente è lo stesso di quello successivo (che significa che hanno la stessa ore). Se sì lo fai fino a quando il ciclo while non restituisce false. Quale è questo codice:

$DayAmountOfConsecutiveSameHours = 1; 
while(isset($arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours)]) && 
    ($opening_hours[$arrayKeys[$dayCount]] === $opening_hours[$arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours)]])) 
    $DayAmountOfConsecutiveSameHours++; 

Quindi se si dispone di più di 1 voce si crea un intervallo da uno all'altro giorno. Che è questo codice:

if($DayAmountOfConsecutiveSameHours > 1) 
    $result[$arrayKeys[$dayCount] . " - " . $arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours-1)]] = $opening_hours[$arrayKeys[$dayCount]]; 

Se avete solo 1 giorno con le stesse ore si aggiunge solo che alla matrice risultati. Che è questo codice:

else 
    $result[$arrayKeys[$dayCount]] = $opening_hours[$arrayKeys[$dayCount]]; 

E in base a quanti giorni le stesse ore hanno si ignorare gli elementi dell'array successivi. Che è questo codice:

$dayCount += ($DayAmountOfConsecutiveSameHours - 1); 

codice completo:

<?php 

    $opening_hours = [ 
      "Monday" => ["09:00", "17:00"], 
      "Tuesday" => ["09:00", "17:00"], 
      "Wednesday" => ["08:00", "13:00"], 
      "Thursday" => ["09:00", "17:00"], 
      "Friday" => ["09:00", "17:00"], 
      "Saturday" => ["10:00", "16:00"], 
      "Sunday" => ["Closed"], 
     ]; 


    $amountOfDays = count($opening_hours); 
    $arrayKeys = array_keys($opening_hours); 

    for($dayCount = 0; $dayCount < $amountOfDays; $dayCount++) { 
     $DayAmountOfConsecutiveSameHours = 1; 
     while(isset($arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours)]) && ($opening_hours[$arrayKeys[$dayCount]] === $opening_hours[$arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours)]])) 
      $DayAmountOfConsecutiveSameHours++; 

     if($DayAmountOfConsecutiveSameHours > 1) 
      $result[$arrayKeys[$dayCount] . " - " . $arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours-1)]] = $opening_hours[$arrayKeys[$dayCount]]; 
     else 
      $result[$arrayKeys[$dayCount]] = $opening_hours[$arrayKeys[$dayCount]]; 

     $dayCount += ($DayAmountOfConsecutiveSameHours - 1); 
    } 

    print_r($result); 

?> 

uscita:

Array 
(
    [Monday - Tuesday] => Array 
     (
      [0] => 09:00 
      [1] => 17:00 
     ) 

    [Wednesday] => Array 
     (
      [0] => 08:00 
      [1] => 13:00 
     ) 

    [Thursday - Friday] => Array 
     (
      [0] => 09:00 
      [1] => 17:00 
     ) 

    [Saturday] => Array 
     (
      [0] => 10:00 
      [1] => 16:00 
     ) 

    [Sunday] => Array 
     (
      [0] => Closed 
     ) 

) 

Demo

+0

Grazie per le spiegazioni e l'intera funzione. Funziona come dovrebbe. Prima di fare questa domanda ho iniziato a confrontare il prossimo elemento di un array con quello attuale nel mio caso non ha funzionato. Thnak tu di nuovo. – David

+0

@David Prego. – Rizier123

+0

@David ha aggiornato la mia risposta e semplificato un po 'tutto. Spera che sia più facile capire – Rizier123