Portál AbcLinuxu, 10. května 2025 19:31

Dotaz: Jak na vnořená pole v php

4.6.2014 20:17 LM
Jak na vnořená pole v php
Přečteno: 710×
Odpovědět | Admin
Ahoj, můžete mi prosím poradit, jak prohledávat pole v php?

když budu mít pole
$arr['a'] = array('1');
$arr['b'] = array('2');
$arr['c'] = array('3');
$arr['d'] = array('4');

$arr['b']['a'] = array('1');
$arr['b']['b'] = array('2');

$arr['b']['b']['a'] = array('1');
$arr['b']['b']['b'] = array('1');
a když bude
$dis = array('b');
tak potřebuji získat hodnotu z
$arr['b']
a když bude
$dis = array('b', 'b');
tak potřebuji získat hodnotu z
$arr['b']['b']
a když bude
$dis = array('b', 'b', 'b');
tak potřebuji získat hodnotu z
$arr['b']['b']['b']
atd.. Vždy znám jen hloubku toho vnoření, což je počet klíčů v poli $dis. Děkuji za případnou pomoc
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

4.6.2014 20:41 Kit
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
Odpovědět | | Sbalit | Link | Blokovat | Admin
Místo prohledávání polí používáme databáze. V příkladech však žádné vnořené pole nevidím. K čemu to potřebuješ? Třeba se dá obejít i bez toho prohledávání.
Josef Kufner avatar 4.6.2014 21:21 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ty se v podstatě snažíš získat vrchol na konci cesty grafem (stromem). Na to je asi nejjednodušší toto:
$arr = array('a' => array('b' => array('c' => 'Hello')));
$path = array('a', 'b', 'c');

function walkPath($arr, $path) {
  $p = & $arr;
  foreach ($path as $n) {
    if (array_key_exists($n, $p)) {
      $p = & $p[$n];
    } else {
      throw new \InvalidArgumentException('Invalid path.');
    }
  }
  return $p;
}

// Toto by melo vypsat 'Hello'
echo walkPath($arr, $path), "\n";
Hello world ! Segmentation fault (core dumped)
4.6.2014 21:40 LM
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
Díky za kód ale dívám se co jsi napsal a zjistil jsem, že jsem špatně položil dotaz, SAKRA! Ale snad jen taková drobnost, teda pro odborníka, ne pro mně :-( Potřebuji vypsat vždy všechny, ne jen ten poslední, čili
a
ab
abc
Děkuji
4.6.2014 21:51 LM
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
Pepo ale stejně tohle
$arr = array('a' => array('b' => array('c' => 'Hello')));
není totžné s tím co potřebuji
$arr = array();
$arr['a'] = array('a');
$arr['a']['b'] = array('ab');
$arr['a']['b']['c'] = array('abc');
Josef Kufner avatar 4.6.2014 22:54 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
Přílohy:
To nepůjde. Nemůžeš na jedno místo nacpat dvě hodnoty. $arr['a'] buď může obsahovat array('a') (2. řádek) nebo může obsahovat array('b' => array('ab')) (3. řádek).
$arr = array('a' => array('b' => array('c' => 'Hello')));
je totéž jako:
$arr = array();
$arr['a']['b']['c'] = 'Hello';
Pokud chceš mít v tom stromu hodnoty i jinde než na listech, tak musíš buď zdvojnásobit vrstvy, nebo určit speciální klíč pro hodnoty:
$arr = array();
$arr['a']['#'] = 'a';
$arr['a']['b']['#'] = 'ab';
$arr['a']['b']['c']['#'] = 'abc';
Pak v kterémkoliv vrcholu budeš mít k dispozici hodnotu pod klíčem '#'.

Tedy celý strom bude vypadat takto -- viz příloha.

Ale je to takové ošklivé, i když vcelku efektivní.
Hello world ! Segmentation fault (core dumped)
4.6.2014 23:02 LM
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
Nevím, zda si rozumíme, co příklad? Aktuální situace:

V systému je mimo jiné takový kousek pole
$arr                = array();
$arr['a']           = array('FOO' => 'a',   'BAR' => 'a2');
$arr['a']['b']      = array('FOO' => 'ab',  'BAR' => 'ab2');
$arr['a']['b']['c'] = array('FOO' => 'abc', 'BAR' => 'abc2');

$dis = array('a', 'b', 'c');
a potřebuji nadefinovat takové nové pole pro další práci...
$newarr = array();
$newarr['a'] = array('FOO' => 'a',   'BAR' => 'a2');
$newarr['b'] = array('FOO' => 'ab',  'BAR' => 'ab2');
$newarr['c'] = array('FOO' => 'abc', 'BAR' => 'abc2');
a ještě výsledky
echo $newarr['a']['FOO']; //a
echo $newarr['a']['BAR']; //a2
echo $newarr['b']['FOO']; //ab
echo $newarr['b']['BAR']; //ab2
echo $newarr['c']['FOO']; //abc
echo $newarr['c']['BAR']; //abc2
Je to lepší ? Díky
Josef Kufner avatar 4.6.2014 23:18 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
Pokud poznáš 'a' of 'FOO', tak to prostě jen rekurzivně projdi.
Hello world ! Segmentation fault (core dumped)
4.6.2014 23:21 LM
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
Znám pouze jen názvy klíčů uložené v $dis
$dis = array('a', 'b', 'c');
Josef Kufner avatar 4.6.2014 23:34 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
Takže když je to v $dis, tak je to 'a' a jinak 'FOO'? Pokud ano, tak jednoduchá rekurzivní funkce na průchod stromem ti to pořeší.
Hello world ! Segmentation fault (core dumped)
4.6.2014 23:44 LM
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
Nee, v poli $dis jsou uloženy názvy klíčů, klíč s názvem 'a', 'b' a 'c'. Tyto klíče jsou shodné jak pro staré pole $arr, tak pro nově definované pole $newarr.
5.6.2014 08:56 deadmail
Rozbalit Rozbalit vše Re: Jak na vnořená pole v php
V systému je mimo jiné takový kousek pole
$arr                = array();
$arr['a']           = array('FOO' => 'a',   'BAR' => 'a2');
$arr['a']['b']      = array('FOO' => 'ab',  'BAR' => 'ab2');
$arr['a']['b']['c'] = array('FOO' => 'abc', 'BAR' => 'abc2');
Takze vlastne mate pole:
Array ( [a] => Array ( [FOO] => a [BAR] => a2 [b] => Array ( [FOO] => ab [BAR] => ab2 [c] => Array ( [FOO] => abc [BAR] => abc2 ) ) ) ) 
Sice nevidim dovod takeho pouzitia, ale potom nieco taketo by to mohlo generovat:
 
 $dis = array('a', 'b', 'c'); 

 $newarr = array(); $tmp = $arr;
 foreach($dis as $k) {
  $newarr[$k] = array_intersect_key($tmp[$k], array('FOO' => 0, 'BAR' => 0));
  // $newarr[$k] = array('FOO' => $tmp[$k]['FOO'], 'BAR' => $tmp[$k]['BAR']); //alebo takto
  $tmp = $tmp[$k];
 }

 print_r($newarr);

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.