Portál AbcLinuxu, 10. května 2025 19:31
$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
$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";
a ab abcDěkuji
$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');
$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í.
$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']; //abc2Je to lepší ? Díky
$dis = array('a', 'b', 'c');
V systému je mimo jiné takový kousek poleTakze vlastne mate 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');
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);
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.