Autor Zpráva
martin b.
Profil *
Ahoj,

prosím vás moc o pomoc, potřebuju projít pole a najít nějakou položku podle hledaného id, ale už jsem se do toho zamotal natolik, že nevím jak na to.

Potřebuju najít objekt - TextNode, kde $id je zadáno ve funkci jako parametr.

Mám pole v tomto tvaru
array(2) {
  ["children"]=>
	  array(2) {
	    [1]=>
		    array(2) {
		      ["children"]=>
			      array(1) {
			        [2]=>
				        array(2) {
				          ["children"]=>
					          array(0) {
					          }
				          ["node"]=>
					          object(TextNode)#70 (4) {
					            ["text"]=>
					            string(14) "Podkategorie 1"
					            ["ident"]=>
					            string(0) ""
					            ["id"]=>
					            int(2)
					            ["parentId"]=>
					            int(1)
					          }
				        }
			      }
		      ["node"]=>
			      object(TextNode)#42 (4) {
			        ["text"]=>
			        string(11) "Kategorie 1"
			        ["ident"]=>
			        string(0) ""
			        ["id"]=>
			        int(1)
			        ["parentId"]=>
			        int(-1)
			      }
		    }
	    [3]=>
		    array(2) {
		      ["children"]=>
			      array(1) {
			        [4]=>
				        array(2) {
				          ["children"]=>
					          array(1) {
					            [5]=>
					            array(2) {
					              ["children"]=>
						              array(0) {
						              }
					              ["node"]=>
						              object(TextNode)#73 (4) {
						                ["text"]=>
						                string(17) "Podpodkategorie 1"
						                ["ident"]=>
						                string(0) ""
						                ["id"]=>
						                int(5)
						                ["parentId"]=>
						                int(4)
						              }
					            }
					          }
				          ["node"]=>
					          object(TextNode)#72 (4) {
					            ["text"]=>
					            string(14) "Podkategorie 2"
					            ["ident"]=>
					            string(0) ""
					            ["id"]=>
					            int(4)
					            ["parentId"]=>
					            int(3)
					          }
				        }
			      }
		      ["node"]=>
			      object(TextNode)#71 (4) {
			        ["text"]=>
			        string(11) "Kategorie 2"
			        ["ident"]=>
			        string(0) ""
			        ["id"]=>
			        int(3)
			        ["parentId"]=>
			        int(-1)
			      }
		    }
	  }
  ["node"]=>
	  object(TextNode)#43 (4) {
	    ["text"]=>
	    string(0) ""
	    ["ident"]=>
	    string(0) ""
	    ["id"]=>
	    int(-1)
	    ["parentId"]=>
	    NULL
	  }
}



A zkoušel jsem to takovou funkcí
		public function find($id, $array) {
			if(isset($array['node'])) {
				$node = $array['node'];
				if($node->id == $id) {
					return $node;
				}
			}
			foreach($array['children'] as $children) {
				$this->find($id, $children);
			}
		}


Ale vrací mi null. Asi na to jdu špatně. Můžete mi tedy prosím někdo poradit, jak na to? Pokud by se našel i někdo, pro koho by to byla hračka, potřeboval bych získat i všechny parenty toho hledaného TextNode.

Děkuji moc za pomoc!
Majkl578
Profil
Možná by bylo dobré prvně stanovit jak takové pole může vypadat nebo jak vypadá vždy.
Z tohoto dumpu předpokládám, že je vždy pole s klíčemi "children", který obsahuje potomky do neurčité hloubky a "node", kde je objekt instanceof TextNode.
Může nastat jiná situace?

PS: Asi by nebylo špatné exportovat to pole pomocí funkce var_export, abych mohl použít to samé a nemusel si ho ručně sestavovat. :)
martin b.
Profil *
Majkl578:
Jiná situace nastat nemůže. Pole bude vždycky stejné jako v tom dumpu.
martin b.
Profil *
Věděl by někdo prosím jak na to? Spěchá to, zkoušel jsem si s tím celkem dlouho hrát, ale pořád se mi to nedaří...
Majkl578
Profil
Chvíli jsem si s tím hrál, tak schválně jak to bude fungovat tobě. :)
Zkus toto:
var_dump(findTextNode(4, $data));


function findTextNode($id, array $ary)
{
	if ($ary['node'] instanceof TextNode && $ary['node']->id === $id) {
		return $ary['node'];
	} elseif ($ary['children']) {
		foreach ($ary['children'] as $child) {
			if (($res = findTextNode($id, $child)) instanceof TextNode) {
				return $res;
			}
		}
	}
}

První parametr je id které hledáš, druhý je pole ve kterém se hledá.
Při nalezení vrátí daný TextNode objekt, pokud nic nenajde, dostaneš null.

Rodiče by neměl být problém nalézt tou samou funkcí, akorát s hodnotou property parentId vráceného TextNode objektu.
martin b.
Profil *
Majkl578:
Díky moc, funguje to bezvadně! Člověk by nevěřil, kolik času dá zabrat taková malá část kódu (v mém případě:-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: