سؤال

لماذا لا يعمل الكود التالي كما كنت أتوقع؟

<?php
$data = array(
    array('Area1', null, null),
    array(null, 'Section1', null),
    array(null, null, 'Location1'),
    array('Area2', null, null),
    array(null, 'Section2', null),
    array(null, null, 'Location2')
);
$root = array();
foreach ($data as $row) {
    if ($row[0]) {
        $area = array();
        $root[$row[0]] =& $area;
    } elseif ($row[1]) {
        $section = array();
        $area[$row[1]] =& $section;
    } elseif ($row[2]) {
        $section[] = $row[2];
    }
}
print_r($root);

نتيجة متوقعة:

Array(
    [Area1] => Array(                         
            [Section1] => Array(
                    [0] => Location1
                )                   
        )
    [Area2] => Array(           
            [Section2] => Array(              
                    [0] => Location2
                )                   
        )
)

نتيجة فعلية:

Array(
    [Area1] => Array(                         
            [Section2] => Array(
                    [0] => Location2
                )                   
        )
    [Area2] => Array(           
            [Section2] => Array(              
                    [0] => Location2
                )                   
        )
)
هل كانت مفيدة؟

المحلول

إذا قمت بتعديل الكود الخاص بك على سطرين كما يلي:

$area = array();

$section = array();

الى هذا:

unset($area);
$area = array();

unset($section);
$section = array();

وسوف تعمل كما هو متوقع.

في النسخة الأولى، $area و $section تعمل بمثابة "مؤشرات" للقيمة الموجودة داخل ملف $root مجموعة مصفوفة.إذا قمت بإعادة تعيين القيم أولاً، فيمكن بعد ذلك استخدام هذه المتغيرات لإنشاء مصفوفات جديدة تمامًا بدلاً من الكتابة فوق المصفوفات السابقة.

نصائح أخرى

وهذا سوف يعمل أيضا:

$root[$row[0]] = array();
$area =& $root[$row[0]];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top