Mengurutkan array dalam array 3 redup di PHP [duplikat]

Oke, saya mengalami kesulitan dan mencoba banyak solusi tetapi tidak berhasil. Menyerah beberapa jam sekarang untuk hal ini, dan masih belum ada apa-apa.

Saya memiliki array yang terlihat seperti ini: $data['dietcontent'][1][1][1]

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

Array ini, saya ingin memilah-milah Waktu Makannya, yang ada pada $data['dietcontent'][1][1][1].MealTime

Array 3d dalam format ini:

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

$mealNumber bisa dari 1 sampai 7, $mealLine bisa dari 1 sampai 7

Oke ini cukup sulit untuk dijelaskan. Strukturnya bisa dibuat lebih baik, tapi karena saya baru mengerjakannya, saya tidak bisa berbuat apa-apa.

Jadi daripada menjelaskan, saya ingin memberikan contoh bagaimana tampilannya sekarang, dan seperti apa yang saya inginkan.

Berikut ini contohnya:

$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

Seperti itulah tampilannya. Sekarang saya ingin mengurutkan tempat $mealNumber (kedua []) dalam array ini, setelah MealTime. Jadi akan terlihat seperti ini setelahnya:

$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

Bagaimana saya bisa melakukan ini?! Bantuan Anda sangat dihargai!!


person Karem    schedule 26.12.2011    source sumber
comment
@hakre saya tidak bisa mendapatkan solusi atas pertanyaan itu untuk saya!   -  person Karem    schedule 27.12.2011


Jawaban (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;
}

Edit: menyetel kunci yang salah

person Savid    schedule 26.12.2011
comment
bagaimana cara mengembalikan semuanya ke $data['dietcontent'] ? Saya mencoba $day[] = $newMeals dan kemudian di luar foreach $data['dietcontent'] = $day; tapi itu tidak berhasil. - person Karem; 27.12.2011
comment
&$day pada baris 1 dilewatkan dengan referensi. Setiap perubahan pada $day akan diterapkan kembali ke array asli $data['dietcontent']. jadi $day = $newMeals; akan mengubah array aslinya. Anda juga dapat melakukan foreach($data['dietcontent'] as $key=>$day){ lalu pada baris terakhir $data['dietcontent'][$key] = $newMeals; - person Savid; 27.12.2011
comment
Terima kasih. Ini mulai bekerja. Tapi tidak dengan benar. Saat diurutkan, misalnya Meal 2, ia memiliki 7 baris (yang ketiga [] dalam array). Dalam contoh array saya, 2 di antaranya terisi dan saya berharap mereka menjadi yang pertama dalam indeks array (jadi dalam hal ini saya dapat menjangkaunya dengan [1], [2]), dan yang kosong bisa muncul setelahnya, jika ada. Mereka sudah seperti ini sebelum menyortir dengan kode Anda. Karena saat ini dibuat 2 baris kosong, sebelumnya baris terisi, lalu 1 baris kosong, lalu baris terisi, lalu 2 baris kosong lagi. - person Karem; 27.12.2011
comment
tidak yakin persis apa yang Anda maksud tetapi jika Anda hanya perlu mengurutkan sebagian dari array, Anda harus memisahkan array, lalu mengurutkan sebagian, lalu menggabungkannya kembali. Anda harus memposting lebih banyak contoh untuk bantuan lebih lanjut - person Savid; 27.12.2011