2014-11-10 6 views
0

Допустим, у вас есть массив дней и openinghours для магазина, как это:Сортировка массива в зависимости от различных значений

Array 
(
    [monday] => Array 
     (
      [day] => Monday 
      [isopen] => true 
      [open] => 10:00 
      [close] => 17:00 
     ) 

    [tuesday] => Array 
     (
      [day] => Tuesday 
      [isopen] => true 
      [open] => 10:00 
      [close] => 17:00 
     ) 

    [wednesday] => Array 
     (
      [day] => Wednesday 
      [isopen] => true 
      [open] => 10:00 
      [close] => 17:00 
     ) 

    [thursday] => Array 
     (
      [day] => Thursday 
      [isopen] => true 
      [open] => 10:00 
      [close] => 17:00 
     ) 

    [friday] => Array 
     (
      [day] => Friday 
      [isopen] => true 
      [open] => 10:00 
      [close] => 17:00 
     ) 

    [saturday] => Array 
     (
      [day] => Saturday 
      [isopen] => false 
      [open] => 11:00 
      [close] => 14:00 
     ) 

    [sunday] => Array 
     (
      [day] => Sunday 
      [isopen] => false 
      [open] => 01:00 
      [close] => 01:00 
     ) 

) 

сейчас, я хочу, чтобы отсортировать эти дети, как это:

monday - friday: 10:00-17:00 
saturday-sunday: closed 

чтобы сказать среда закрывала 16:00 я хотел бы этот выход:

monday-tuesday: 10:00-17:00 
wednesday: 10:00-16:00 
thursday-friday: 10:00-17:00 
saturday-sunday: closed 

То есть, я хочу, чтобы отсортировать их, но по-прежнему держать порядок сверху вниз как первичная сортировка. Итак, как бы вы это сделали? Зациклируйте их все и сохраните часы в памяти, а сравнить дни - это один из вариантов, но нет ли лучшего решения?

EDIT: Реальный массив было предложено здесь:

$days = array(
      'monday' => array(
        'day' => 'Monday', 
        'isopen' => true, 
        'open' => '10:00', 
        'close' => '17:00', 
       ), 
      'tuesday' => array(
        'day' => 'Tuesday', 
        'isopen' => true, 
        'open' => '10:00', 
        'close' => '17:00', 
       ), 
      'wednesday' => array(
        'day' => 'Wednesday', 
        'isopen' => true, 
        'open' => '10:00', 
        'close' => '17:00', 
       ), 
      'thursday' => array(
        'day' => 'Thursday', 
        'isopen' => true, 
        'open' => '10:00', 
        'close' => '17:00', 
       ), 
      'friday' => array(
        'day' => 'Friday', 
        'isopen' => true, 
        'open' => '10:00', 
        'close' => '17:00', 
       ), 
      'saturday' => array(
        'day' => 'Saturday', 
        'isopen' => false, 
        'open' => '10:00', //Not used since isopen = false 
        'close' => '17:00', //Not used since isopen = false 
       ), 
      'sunday' => array(
        'day' => 'Sunday', 
        'isopen' => false, 
        'open' => '10:00', //Not used since isopen = false 
        'close' => '17:00', //Not used since isopen = false 
       ) 
     ); 
+1

Это не «сортировка» массива, это «слияние» записей массива, и нет встроенного функционала n, который сделает это за вас, так что вам в основном нужно пройти через массив, проверяя значения и объединяя их вручную. –

+2

Думаю, я мог бы ответить на ваш вопрос, но ... вы отправили данные var_dumped, которые я не могу просто захватить , вставьте мою IDE и играйте с ..., и я слишком ленив, чтобы преобразовать ее обратно в php. Сожалею. – georg

+0

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

ответ

0

Что-то вроде:

$newArray = array(); 
$dayCount = -1; 
foreach ($days as $day) { 
    if (($dayCount < 0) || 
     ($day['isopen'] != $newArray[$dayCount]['isopen']) || 
     ($day['open'] != $newArray[$dayCount]['open']) || 
     ($day['close'] != $newArray[$dayCount]['close'])) { 
     $newArray[++$dayCount] = array_merge(
      $day, 
      array('dayTo' => '') 
     ); 
    } else { 
     $newArray[$dayCount]['dayTo'] = $day['day']; 
    } 
} 
var_dump($newArray); 

EDIT

С Опубликованная исходного массива, это дает:

array(2) { 
    [0]=> 
    array(5) { 
    ["day"]=> 
    string(6) "Monday" 
    ["isopen"]=> 
    bool(true) 
    ["open"]=> 
    string(5) "10:00" 
    ["close"]=> 
    string(5) "17:00" 
    ["dayTo"]=> 
    string(6) "Friday" 
    } 
    [1]=> 
    array(5) { 
    ["day"]=> 
    string(8) "Saturday" 
    ["isopen"]=> 
    bool(false) 
    ["open"]=> 
    string(5) "10:00" 
    ["close"]=> 
    string(5) "17:00" 
    ["dayTo"]=> 
    string(6) "Sunday" 
    } 
} 

Если вы несовпадающие open и close значения на "закрытых" дней, то изменение состояния if к

if (($dayCount < 0) || 
    ($day['isopen'] != $newArray[$dayCount]['isopen']) || 
    ($day['isopen'] && (($day['open'] != $newArray[$dayCount]['open']) || 
         ($day['close'] != $newArray[$dayCount]['close'])))) { 

может помочь

+0

Мне нравится это решение. Это не так, как бы то ни было, «группировать» закрытые дни. То есть, он получает 3 значения в массиве, когда это должно быть 2 значения; «dayTo» должен быть «воскресным» в «субботу». Иначе это замечательно. – gubbfett

+0

Мой тестовый прогон дал «dayTo» «воскресенья» в «субботу» из вашего опубликованного массива. –

+0

Это совершенно верно, моя вина. Сожалею. – gubbfett

1

Это сложно, но не то, что невозможно (и быть в курсе, что это своего рода объединение, а не сортировки):

$sorted = array(); 
    foreach($days as $k=>$v){ 

     $current = array(
      'open'=>$v['open'], 
      'close'=>$v['close'], 
      'isopen'=>$v['isopen'], 
     );    

     if (empty($sorted) || $previous != $current) { 
      $sorted[] = array('firstDay'=>$k,'open'=>$v['open'],'close'=>$v['close']); 
     } else 
      $sorted[count($sorted)-1]['lastDay'] = $k; 


     $previous = $current; 
    } 

    print_r($sorted); 
Смежные вопросы