2016-01-01 2 views
-3

в основном у меня есть этот массив:PHP значения Перестановка массива на основе состояния

array(
'08:00-08:40' => array(
    't' => '39', 
    'sub' => 'COMP' 
), 
'08:40-09:20' => array(
    't' => '17', 
    'sub' => 'KIS' 
), 
'09:20-10:00' => array(
    't' => '36', 
    'sub' => 'B/ST' 
), 
'10:20-11:00' => array(
    't' => '7', 
    'sub' => 'ENG' 
), 
'11:00-11:40' => array(
    't' => '36', 
    'sub' => 'B/ST' 
), 
'11:40-12:20' => array(
    't' => '31', 
    'sub' => 'HIS' 
), 
'12:20-13:00' => array(
    't' => '26', 
    'sub' => 'PHY' 
), 
'14:00-14:40' => array(
    't' => '33', 
    'sub' => 'GEO' 
), 
'14:40-15:20' => array(
    't' => '31', 
    'sub' => 'HIS' 
), 
'15:20-16:00' => array(
    't' => '20', 
    'sub' => 'BIO' 
) 

)

Мое требование заключается в том, что если элемент [ «суб»] дважды появляется во всем массиве, то оба экземпляры должны быть рядом друг с другом в массиве.

так для вышеприведенного массива я ожидаю иметь следующий вывод:

array(
'08:00-08:40' => array(
    't' => '39', 
    'sub' => 'COMP' 
), 
'08:40-09:20' => array(
    't' => '17', 
    'sub' => 'KIS' 
), 
'09:20-10:00' => array(
    't' => '36', 
    'sub' => 'B/ST' 
), 
'10:20-11:00' => array(
    't' => '36', 
    'sub' => 'B/ST' 
), 
'11:00-11:40' => array(
    't' => '7', 
    'sub' => 'ENG' 
), 
'11:40-12:20' => array(
    't' => '31', 
    'sub' => 'HIS' 
), 
'12:20-13:00' => array(
    't' => '31', 
    'sub' => 'HIS' 
), 
'14:00-14:40' => array(
    't' => '26', 
    'sub' => 'PHY' 
), 
'14:40-15:20' => array(
    't' => '33', 
    'sub' => 'GEO' 
), 
'15:20-16:00' => array(
    't' => '20', 
    'sub' => 'BIO' 
) 

)

я не могу понять, как адаптировать this solution к моему case..any очень оцененная

+0

Почему бы вам просто не отсортировать массив на основе значений 'sub'? Это поставит все те же ценности рядом друг с другом. – Barmar

+0

@Barmar Я отредактировал название и тело вопроса. Сортировка изменит элементы, но я хочу, чтобы значения были перегруппированы – GOA

ответ

1

Вы можете сделать это, отсортировав значения на основе элемента sub. Чтобы сохранить ключи в исходном порядке, вы можете сохранить их в другом массиве, затем используйте array_combine, чтобы вернуть его вместе с отсортированным массивом.

$keys = array_keys($array); 
usort($array, function($x, $y) { 
    if ($x['sub'] == $y['sub']) { 
     return 0; 
    } elseif ($x['sub'] < $y['sub']) { 
     return -1; 
    } else { 
     return 1; 
    } 
}); 
$array = array_combine($keys, $array);