PHP, Diziler ve Referanslar

2 Cevap php

Ben bekliyordum Neden olarak aşağıdaki kod çalışmıyor?

<?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);

Beklenen sonuç:

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

Gerçek sonuç:

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

2 Cevap

Aşağıdaki gibi iki satır kodunuzu değiştirirseniz:

$area = array();

$section = array();

Bunun için:

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

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

beklendiği gibi çalışacaktır.

İlk versiyonda, $area ve $section $root dizinin içindeki değeri "pointer" olarak hareket etmektedirler. Ilk değerlerini sıfırlamak varsa, bu değişkenler sonra yerine geçen diziler yazılmadan marka yeni diziler oluşturmak için kullanılabilir.

Ayrıca ben de bu işleri yaparken bulundu:

$root[$row[0]] = array();
$area =& $root[$row[0]];