Çok boyutlu bir dizi içinde belirli öğeye erişmek için bir değişken kullanmak nasıl?

1 Cevap php

Xml verileri değiştirmek ve geri yazmak için PHP dizileri kullanıyorum. Bu (gösteri amacıyla basitleştirilmiş) xml yapısı:

<docs>
  <folder>
    <name>Folder name</name>
    <date>20.06.2009</date>
    <folder>
      <name>Subfolder1</name>
      <date></date>
    </folder>
    <folder>
      <name>Subfolder1</name>
      <date></date>
    </folder>
    <file>
      <name></name>
    </file>
  </folder>
  <name></name>
  <date></date>
</docs>

this code, bu daha sonra ayrıştırılır ve çok boyutlu bir diziye dönüştü kullanma:

Array
(
    [docs] => Array
        (
            [_c] => Array
                (
                    [folder] => Array
                        (
                            [_c] => Array
                                (
                                    [name] => Array
                                        (
                                            [_v] => Folder name
                                        )

                                    [date] => Array
                                        (
                                            [_v] => 20.06.2009
                                        )

                                    [folder] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [_c] => Array
                                                        (
                                                            [name] => Array
                                                                (
                                                                    [_v] => Subfolder1
                                                                )

                                                            [date] => Array
                                                                (
                                                                    [_v] => 
                                                                )

                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [_c] => Array
                                                        (
                                                            [name] => Array
                                                                (
                                                                    [_v] => Subfolder1
                                                                )

                                                            [date] => Array
                                                                (
                                                                    [_v] => 
                                                                )

                                                        )

                                                )

                                        )

                                    [file] => Array
                                        (
                                            [_c] => Array
                                                (
                                                    [name] => Array
                                                        (
                                                            [_v] => 
                                                        )

                                                )

                                        )

                                )

                        )

                    [name] => Array
                        (
                            [_v] => 
                        )

                    [date] => Array
                        (
                            [_v] => 
                        )

                )

        )

)

Uzun, biliyorum. Ama şimdi asıl konuya. I Subfolder2 Bu durumda adında bir alt klasöre başka bir dosya eklemek istiyorsanız, u yapısını görünce elle bunu yapmak için bir sorun değil:

array_push($array['docs']['_c']['folder']['_c']['folder'][1], $newfile);

Ben (docs/Folder name/Subfolder2 gibi), algoritma (her [klasörün] adını kontrol dizisi yapısını analiz sahip tek bir klasörün yolunu bilen fonksiyonu ile bunu yapmak istediğinizde Şimdi, kontrol ederseniz orada tüm iyi, ama ben yeni dosya için bir "array" yolunu olurdu bir değişken oluşturmak için bir yol bulamıyorum - bir veya daha fazla klasör ['_c'] veya [sayı]) 'dir.

Ben bu satırları boyunca bir yerde düşünüyordum:

$writepath = "['docs']['_c']['folder']...[1]"; // path string
array_push($array{$writepath}, $newfile);

Tabii ki bu geçerli bir sözdizimi değildir.

Yani, nasıl dizi elemanları aracılığıyla bir yolunu içeren bir değişken yapabilir? W3C ve çok boyutlu diziler üzerinde hiçbir yararlı bilgi bulma php.net üzerinde biraz araştırma yaptım ...

Herkes elbette vb yapısı, xml dönüşüm / manipülasyon ile ilgili başka bir öneriniz varsa, ben bu kadar veri işleme yeterli yolundan olduğunu biliyoruz.

Herhangi bir giriş için teşekkürler,

Erik


Edit: referans ile ilgili olarak, başvuru başvuru mümkün mü? Bu dizilerin bir dizi aracılığıyla 'imlecini' taşımak için bir yol olurdu? Gibi bir şey:

$pointer = &$array['docs'];
if (key($pointer) == '_c') { $pointer = &$pointer['_c']; }
else (
  // create an array with '_c' key instead of empty '_v' array
)

This syntax does not work.

Edit: sözdizimi işleri, ... tüm yardım çocuklar için teşekkürler aldırma!

1 Cevap

Başvurularını kullanma yardımcı olabilir.

Sen öncelikle bir yolu dize için dizinin verilen bir bölümüne bir başvuru döndüren bir işlev yazabilirsiniz. Örneğin, get_path_array("Documents") dönmek $array['docs']['_c']['folder']['_c']['folder'][1], $newfile)

<?php
function &get_path_array($path_str)
{
    // your code to seek to seek the path in the array
    return $result;
}
>?php

Şimdi bir öğe eklemek için, sadece yapabileceği

array_push(get_path_array("docs/Folder name/Subfolder2"), $newfile);

Eğer bu sizin için ne aradığını mı?

(php references daha fazla bilgi için bakınız)

Edit: Eric'in yorumuna cevap olarak (bir açıklama sığmayacak kadar biraz zor)

Ben diziler nasıl hakkında karıştı olabilir düşünüyorum. Php de çok boyutlu diziler, diğer diziler depolamak sadece diziler olarak böyle bir şey yok gerçekten. Örneğin,

<?php
$a = array(array(1,2,3), array(4,5,6));
$b = $a[1];
echo $b[0];
?>

Çıktısı "4".

Note that in the above code, $b is a copy of $a[1], changing $b won't affect $a[1]. However, using references, this can be made to work:

<?php
$a = array(array(1,2,3), array(4,5,6));
$b = &$a[1]; // the & make $b a reference to $a[1]
$b[0] = 4242;
print_r($a);
?>

Çıkışlar:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [1] => Array
        (
            [0] => 4242
            [1] => 5
            [2] => 6
        )

)

Yani $array['doc']['path'], sadece doğru dizisini aramak için bir döngü kullanabilirsiniz dize oluşturmak için bir ihtiyaç değildir.