PHP özyinelemeli arama ve dizi elemanlarını değiştirin

4 Cevap php

Ben ardışık arama ve dizideki eleman değiştirmek istiyor.

Dizi tabanlı ağaç vb gibi görünüyor

Object
   Children
      Object type A
      Object type B
Object
   Children
      Object type A
Object

vb

Ben diğer öğeleri ile belirli öğeleri değiştirmek mümkün olmak istiyorum, böylece, örneğin, ben dizideki tüm girişleri değiştirmek istediğiniz (en olursa olsun derinlik seviyesi) B tipi bir dizi ile A tipi Ama burada yakalamak bulunuyor: Yeni değiştirilir nesneler de değiştirilmesi gerekir A tipi çocukları olabilir.

Şimdiye kadar var

    foreach($nodes as &$node) {
        // Replace node?
        if($node['type'] == 'RefObject') {
            $n = $this->site->get_node_where('id', $node['node_ref']);
            // Replace node
            $node = $this->site->get_node_where('object_id', $n['object_id']);
            // Get children
            $node['children'] = $this->site->get_descendants($node['lft'], $node['rgt']);
        }
    }
    return $nodes;

RefObjects ilk düzeyini yerini alacak, ancak sonradan eklenen çocuklarını aramaz Hangi.

Saatlerce bu biriyle kafamı duvara dayak oldum. Lütfen yardım edin!

Cheers, Gaz.

4 Cevap

Bir işlev içine kodunuzu koyun ve yine diyoruz. Pseudocode:

function checkArray($array) {
    ...
    if (is_array($node)) {  // or whatever other criterium
        checkArray($node);  // same function
    }
}

Özyineleme temelleri yine aynı kodu aramak için vardır ...

Eğer bir fonksiyon içine bu kodu eklemek ve alt düğümleri üzerindeki işlevini çağırmak gerekir.

böyle bir şey (parseNodes fonksiyon işlev içinde tekrar denir unutmayın):

function parseNodes($node) {

   foreach($nodes as &$node) {
    // Replace node?
    if($node['type'] == 'RefObject') {
        $n = $this->site->get_node_where('id', $node['node_ref']);
        // Replace node
        $node = $this->site->get_node_where('object_id', $n['object_id']);
        // Get children
        $node['children'] = parseNodes($this->site->get_descendants($node['lft'], $node['rgt']));
    }
   }
   return $nodes;
 }

Şaka

PHP 5.3 bir array_replace_recursive yöntemi alır.

Ben sadece bunu kullanmak mümkün olacak umuyoruz ;)

http://www.php.net/manual/fr/function.array-replace-recursive.php

Burada bir özyinelemeli çözüm

function makeObject($array){
   $data = false;
   foreach($array as $key=>$value){
      if(is_array($value)){
        $value = makeObject($value);
      }
      $data -> {$key} = $value;
   }
   return $data;
}

Beni orada almak için teşekkürler!