Сортировка массива в трехмерном массиве в PHP

Хорошо, мне очень тяжело, и я пробовал много решений, но я не могу заставить его работать. Потратил на это несколько часов, и до сих пор ничего.

У меня есть массив, который выглядит так: $data['dietcontent'][1][1][1]

$data['dietcontent'][1][1][1]
--------------------^Day^Meal^Line

Этот массив, который я хотел бы отсортировать для их MealTime, который существует на $data['dietcontent'][1][1][1].MealTime

Трехмерный массив имеет следующий формат:

$data['dietcontent'][1][$mealNumber][$mealLine]['MealTime'].

$mealNumber может быть от 1 до 7, $mealLine может быть от 1 до 7

Ладно, это довольно сложно объяснить. Структуру можно было бы сделать намного лучше, но так как я только работаю над ней, я ничего не могу с этим поделать.

Поэтому вместо того, чтобы объяснять, я хотел бы привести пример того, как это выглядит сейчас и как я хочу, чтобы это выглядело.

Вот пример:

$data['dietcontent'][1][1][1]['MealTime'] // is 07:00
$data['dietcontent'][1][1][2]['MealTime'] // is 07:00
$data['dietcontent'][1][1][3]['MealTime'] // is 07:00
$data['dietcontent'][1][1][4]['MealTime'] // is 07:00
$data['dietcontent'][1][1][5]['MealTime'] // is 07:00
$data['dietcontent'][1][1][6]['MealTime'] // is 07:00
$data['dietcontent'][1][1][7]['MealTime'] // is 07:00
$data['dietcontent'][1][2][1]['MealTime'] // is 01:30
$data['dietcontent'][1][2][2]['MealTime'] // is 01:30
$data['dietcontent'][1][2][3]['MealTime'] // is 01:30
$data['dietcontent'][1][2][4]['MealTime'] // is 01:30
$data['dietcontent'][1][2][5]['MealTime'] // is 01:30
$data['dietcontent'][1][2][6]['MealTime'] // is 01:30
$data['dietcontent'][1][2][7]['MealTime'] // is 01:30

Как это может выглядеть. Теперь я хотел бы отсортировать место $mealNumber (второе []) в этом массиве после MealTime. Так это будет выглядеть после:

$data['dietcontent'][1][1][1]['MealTime'] // is 01:30
$data['dietcontent'][1][1][2]['MealTime'] // is 01:30
$data['dietcontent'][1][1][3]['MealTime'] // is 01:30
$data['dietcontent'][1][1][4]['MealTime'] // is 01:30
$data['dietcontent'][1][1][5]['MealTime'] // is 01:30
$data['dietcontent'][1][1][6]['MealTime'] // is 01:30
$data['dietcontent'][1][1][7]['MealTime'] // is 01:30
$data['dietcontent'][1][2][1]['MealTime'] // is 07:00
$data['dietcontent'][1][2][2]['MealTime'] // is 07:00
$data['dietcontent'][1][2][3]['MealTime'] // is 07:00
$data['dietcontent'][1][2][4]['MealTime'] // is 07:00
$data['dietcontent'][1][2][5]['MealTime'] // is 07:00
$data['dietcontent'][1][2][6]['MealTime'] // is 07:00
$data['dietcontent'][1][2][7]['MealTime'] // is 07:00

Как я могу это сделать?! Ваша помощь очень ценится!!


person Karem    schedule 26.12.2011    source источник
comment
@hakre, я не могу найти решение этого вопроса, которое бы работало на меня!   -  person Karem    schedule 27.12.2011


Ответы (1)


foreach($data['dietcontent'] as &$day){
    //create temp sorting array
    $mealsArr = array();
    foreach($day as $meal){
        $i = 1;
        foreach($meal as $line){
            //put the lines into the temp array using meal time as key
            $mealsArr[$line['MealTime']][$i] = $line;
            $i++;
        }
    }        
    //sort the array by key (meal time!)
    ksort($mealsArr);
    //set up the new meals in the same format as before
    $newMeals = array();
    $i = 1;
    foreach($mealsArr as $lines){
        $newMeals[$i] = $lines;
        $i++;
    }
    //put back the new lines
    $day = $newMeals;
}

Изменить: установка неправильных ключей

person Savid    schedule 26.12.2011
comment
как я могу вернуть все это в $data['dietcontent'] ? Я попробовал $day[] = $newMeals, а затем за пределами foreach $data['dietcontent'] = $day; но это не работает тогда. - person Karem; 27.12.2011
comment
&$day в строке 1 передается по ссылке. Любые изменения в $day будут применены к исходному массиву $data['dietcontent']. поэтому $day = $newMeals; изменит исходный массив. Вы также можете сделать foreach($data['dietcontent'] as $key=>$day){, затем в последней строке $data['dietcontent'][$key] = $newMeals; - person Savid; 27.12.2011
comment
Спасибо. Он начинает работать. Но не правильно. Когда он сортируется, например, Еда 2, он имеет 7 строк (третий [] в массиве). В моем примерном массиве 2 из них заполнены, и я хочу, чтобы они были первыми в индексах массива (так что в этом случае я могу добраться до них по [1], [2]), а затем пустые могут следовать, если таковые имеются. Они такие уже до сортировки с вашим кодом. Потому что прямо сейчас он создает 2 пустые строки, перед одной заполненной, затем 1 пустую строку, затем заполненную и еще 2 пустые строки. - person Karem; 27.12.2011
comment
не совсем уверен, что вы имеете в виду, но если вам нужно отсортировать только часть массива, вам нужно отделить массив, затем отсортировать его часть, а затем присоединиться к нему. Вам нужно будет опубликовать больше примеров для получения дополнительной помощи - person Savid; 27.12.2011