Autor | Zpráva | ||
---|---|---|---|
ts_istudio Profil |
Mám proměnnou $config, ve které je spousta údajů. Potřeboval bych získat všechny hodnoty pod $config['inc_web_popis']. Níže uvedené php vypíše:
inc_web_popis ** -Array inc_xxx ** -Array Já bych ale potřeboval hledat v té poslední úrovni indexů (v příkladu 1-4, 25-27) a když najdu, vrátit odpovídající řetězec "kat" nebo "subkat" a hodnotu ("úvodní strana"). Že je to prasárna, to vím. Je to v projektu, který jsem převzal a není možné to udělat slušně. To číslo (1-4, 25-27) je v celém $config['inc_web_popis'] unikátní. $config['inc_web_popis']['kat'][1] = "úvodní strana"; $config['inc_web_popis']['kat'][2] = "služby"; $config['inc_web_popis']['kat'][3] = "kontakt"; $config['inc_web_popis']['kat'][4] = "sortiment"; $config['inc_web_popis']['subkat'][25] = "sortiment"; $config['inc_web_popis']['subkat'][26] = "sortimfdgdfhent"; $config['inc_web_popis']['subkat'][27] = "sdfsdfsortiment"; $config['inc_xxx'][10] = "odkazy"; $config['inc_xxx'][2] = "fgdus"; $config['inc_xxx'][3] = "dkddd"; echo getDruh($config); function getDruh($input){ foreach ($input as $key => $value) { if ( is_array($cell)) { $w .= " *** <br>"; getDruh($value); } else { $w .= $key." ** -".$value."<br>"; } } return $w; } |
||
tiso Profil |
#2 · Zasláno: 21. 6. 2013, 13:13:00
Neviem, či som to správne pochopil, myslíš toto:
$w = ''; foreach ($config['inc_web_popis']['kat'] as $value) { $w .= "kat ** -$value<br>"; } foreach ($config['inc_web_popis']['subkat'] as $value) { $w .= "subkat ** -$value<br>"; } |
||
ts_istudio Profil |
#3 · Zasláno: 21. 6. 2013, 13:25:05
tiso:
Možná jsem měl napsat, že já ty řetězce "kat" a "subkat" obecně neznám. Takže potřebuju naslepo projít všechno, co je pod $config['inc_web_popis']. Teď uvažuju, jestli to vůbec jde. |
||
peta Profil |
http://www.php.net/manual/en/ref.array.php
http://www.php.net/manual/en/function.array-search.php http://www.php.net/manual/en/function.in-array.php foreach se da napsat tez takto (jestli jsi se dival na mozna reseni v manualu...) foreach ($config as $key=>$value) { $w .= "$key => $value<br>"; } <?php $fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry'); reset($fruit); while (list($key, $val) = each($fruit)) { echo "$key => $val\n"; } ?> |
||
ts_istudio Profil |
#5 · Zasláno: 21. 6. 2013, 13:58:44
peta:
Tvoje rady jsou tak přínosné, jako obvykle. Ještě jednou si přečti ten můj text a zamysli se, jestlis napsal něco, co nevím. |
||
juriad Profil |
#6 · Zasláno: 21. 6. 2013, 14:10:08
Pokud víš, že ten index bude unikátní, tak by ti mohlo pomoct následující:
function doFlatten($pole, $klice, &$vysledek) { foreach ($pole as $klic => $hodnota) { $noveKlice = $klice; $noveKlice[] = $klic; if(is_array($hodnota)) { doFlatten($hodnota, $noveKlice, $vysledek); } else { $vysledek[$klic] = array('hodnota' => $hodnota, 'klice' => $noveKlice); } } } function flatten($pole) { $vysledek = array(); doFlatten($pole, array(), $vysledek); return $vysledek; } přechroustá pole do podoby: Array ( [1] => Array ( [hodnota] => úvodní strana [klice] => Array ( [0] => inc_web_popis [1] => kat [2] => 1 ) ) [2] => Array ( [hodnota] => fgdus [klice] => Array ( [0] => inc_xxx [1] => 2 ) ) [3] => Array ( [hodnota] => dkddd [klice] => Array ( [0] => inc_xxx [1] => 3 ) ) [4] => Array ( [hodnota] => sortiment [klice] => Array ( [0] => inc_web_popis [1] => kat [2] => 4 ) ) [25] => Array ( [hodnota] => sortiment [klice] => Array ( [0] => inc_web_popis [1] => subkat [2] => 25 ) ) [26] => Array ( [hodnota] => sortimfdgdfhent [klice] => Array ( [0] => inc_web_popis [1] => subkat [2] => 26 ) ) [27] => Array ( [hodnota] => sdfsdfsortiment [klice] => Array ( [0] => inc_web_popis [1] => subkat [2] => 27 ) ) [10] => Array ( [hodnota] => odkazy [klice] => Array ( [0] => inc_xxx [1] => 10 ) ) ) |
||
DarkMeni Profil |
function getDruh($input){ foreach ($input as $key => $value) { if ( is_array($cell)){ $w .= " *** <br>"; getDruh($value); } else { $w .= $key." ** -".$value."<br>"; } } return $w; } A nebo jednodušší verze by byla třeba: var_dump($array); Jestli v tom chceš vyhledávat nějakej text, tak bys mohl zkusit, jestli by to nešlo udělat třeba takto: function getDruh($input, $find){ $w = ""; $f = array(); foreach ($input as $key => $value) { if (is_array($value)){ $w .= " *** <br>"; getDruh($value); // Tohle je špatně, chtělo by to tu nějak pořešit tu rekurzi } else { if($find == $value){ $f[] = $key; } $w .= $key." ** -".$value."<br>"; } } return array($w, $f); } |
||
mylan Profil |
Použiť funkciu na rekurzívne hľadanie vo viacrozmernom poli, napríklad odtiaľto a upraviť si ju.
|
||
tiso Profil |
#9 · Zasláno: 21. 6. 2013, 14:40:43
ts_istudio: aha, tak si to uprav takto:
getDruh($config['inc_web_popis']); function getDruh($input){ $w = ''; foreach ($input as $key => $value) { foreach ($value as $value2) { $w .= $key." ** -".$value2."<br>"; } } return $w; } |
||
peta Profil |
ts_istudio: Ok. Polopate. Pomoci array_keys ziskas seznam klicu v nejblizsi vetvi. Pomoci in_array mezi nimi vyhledas ten, ktery te zajima. Pokud tam neni, tak pomoci foreach, kteremu predas seznam klicu a objekt, projdes opet vsechny klice a provedes celou funkci s hledanim klice znovu. A tak dal pro vsechny klice.
A jestli se chces nad nekoho povysovat, mohl by sis uvedomit, ze ja tu rekurzivni funkci napsat umim a ty ne. |
||
ts_istudio Profil |
#11 · Zasláno: 21. 6. 2013, 16:26:13
Tak nakonec to bylo jednodušší, než jsem myslel. Použil jsem postup od tiso, díky moc, i ostatním, kteří se nad tím zamysleli.
|
||
Časová prodleva: 11 let
|
0