Přidání parent ukazatelů do rekurzivního PHP pole. rubrika: Programování: PHP

8 rmaslo
položil/-a 25.10.2014

Mějme pole:

$x['a']['b']['c']['d']['e']='y';
$x['aaa']='FirstLevel';

Toto pole nějak rekurzivně zpracovávám stylem:

function Rekurze($arr)
{
foreach ($arr AS $key =>$val)
  {
  foo($key, $val)
  is_array($val) Rekuze($val);
  }
}

tj. klasicky odebírám prvky od rootu pole.
Ale bohužel bych se někdy potřeboval mrknout dopředu - co již bylo.

Proto bych si do zavedl pole zavedl ukazatel na parent prvek ... tj. pole bych prohnal nějakou funkcí aby vzniklo toto:

$x['a']['b']['c']['d']['e']='y';
$x['aaa']='FirstLevel';
$x['a']['_parent'] = &$x;
$x['a']['b']['_parent'] = &$x['a'];
$x['a']['b']['c']['_parent'] = &$x['a']['b'];
$x['a']['b']['c']['d']['_parent'] = &$x['a']['b']['c'];

A potom klidně při zpracování mohu udělat:

function foo($key, $val)
{
....
if ($key=='e') echo $arr['_parent']['_parent']['_parent']['_parent']['aaa'];
}

V javascriptu tuto techniku používám a ok. Ale vím, že PHP obecně moc nemá rádo proměnné odkazem, důvěru nebudí ani to, že var_export nad $x udělá Fatal Error (i když naopak serialize se zdá velmi hezky udělaný).

Tak jsem se chtěl zeptat zda někdo takovou techniku nad většími poli (počet všech zamořených prvků řádově stovky) používá.

Komentáře

  • p4l4clIn : Ja bych se v prvni rade podival, jestli je takovahle monstroznost vubec nezbytna a nelze to resit lepe nez timto polem.. Zkusenost s php je, ze kdyz clovek dojde k tomu, ze potrebuje takovehle pole, chyba je nekde jinde.. 25.10.2014
  • rmaslo : No mohl bych použít DOM. Už samotný DOMNode class samozřejmě parentNode má. Je to tedy trochu jako s kanónem na vrabce - v podstatě se jedná o zpracování nějakého většího configu, na druhou stranu uložit si config jako XML do DOMu (i kdyby jen pro hrabání se v něm) určitě chyba není. 25.10.2014
  • Kit : BTW: Proč tomu říkáš pole? 25.10.2014
odkaz
2 Tharos
odpověděl/-a 25.10.2014

Potřebuješ bezpodmínečně, aby to bylo pole? Objektové řešení by bylo totiž řádově snazší, vystačil by sis s nějakou třídou Node a eventuálně nějakým iterátorem k ní (podle potřeby a účelu toho všeho).

Řešení přes pole bude asi vždycky těžkopádné.

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.