การเรียงลำดับอาเรย์ในอาเรย์ 3 สลัวใน PHP [ซ้ำกัน]

โอเค ฉันมีช่วงเวลาที่ยากลำบากมากและได้ลองวิธีแก้ปัญหาหลายอย่างแล้วแต่ก็ไม่สามารถทำงานได้ ให้เวลากับเรื่องนี้มาหลายชั่วโมงแล้ว แต่ก็ยังไม่มีอะไรเลย

ฉันมีอาร์เรย์ที่มีลักษณะเช่นนี้: $data['dietcontent'][1][1][1]

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

อาร์เรย์นี้ ฉันต้องการจัดเรียง MealTime ซึ่งมีอยู่บน $data['dietcontent'][1][1][1].MealTime

อาร์เรย์ 3 มิติอยู่ในรูปแบบนี้:

$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 บรรทัดว่าง จากนั้นจึงเติม 1 บรรทัด และอีก 2 บรรทัดว่าง - person Karem; 27.12.2011
comment
ไม่แน่ใจว่าคุณหมายถึงอะไรอย่างชัดเจน แต่ถ้าคุณต้องการเรียงลำดับเพียงบางส่วนของอาร์เรย์ คุณต้องแยกอาร์เรย์ออก ให้เรียงลำดับบางส่วนแล้วรวมกลับเข้าด้วยกัน คุณจะต้องโพสต์ตัวอย่างเพิ่มเติมเพื่อขอความช่วยเหลือเพิ่มเติม - person Savid; 27.12.2011