Autor | Zpráva | ||
---|---|---|---|
ja99 Profil * |
#1 · Zasláno: 19. 11. 2013, 12:53:55 · Upravil/a: ja99
Zdravim, mam nejaky string ktery je vlastne cesta v array:
Takze string: "barvy.0.sub_array.seznam_barev" Znamena cestu k array se seznamem barev: $data['barvy'][0]['sub_array']['seznam_barev'] = array(...); String ktery urcuje cestu nema na pevno dane poradi, takze ty cesty jsou pak ruzne a muzou treba obsahovat jeste sub array. Potrebuju podle te "cesty" ve stringu bud vytahnout hodnoty ktere jsou v promene $data, nebo nastavit jine hodnoty pro promenou $data ale musi se po zapsani novych hodnot zachovat ta cesta kterou urcuje string. Diky ja99: Jeste kdyz to cele napisu pseudokodem snazim se o neco takoveho: $data"barvy.0.sub_array.seznam_barev" = array(...); |
||
Tori Profil |
#2 · Zasláno: 19. 11. 2013, 14:51:05
Postup by snad měl jít pochopit z tohoto příspěvku: Jak vytvorit z retezce nazev multidimenzionalniho pole
|
||
ShiraNai7 Profil |
#3 · Zasláno: 19. 11. 2013, 15:05:06
Vyloženě jednoduše to nejde, musíš cestu vyhodnotit a postupně se polem prokousat. Viz odkaz od Tori.
Než tu byl tento odkaz, sepsal jsem vlastní funkci. Dělá z principu to samé, ale navíc umožnuje cestu v poli vytvořit a také ošetřuje různé chybové stavy. Ber to jako ukázku možného řešení. Pro praktické použití bych tuto funkcionalitu umístil do nějaké třídy a nevracel přímo reference. function &resolveArrayPath(array &$array, $path, $create = true) { $ref = &$array; $keys = explode('.', $path); $lastKey = sizeof($keys) - 1; foreach ($keys as $keyNum => $key) { if (is_array($ref)) { if (!array_key_exists($key, $ref)) { if ($create) { $ref[$key] = ($keyNum === $lastKey) ? null : array(); } else { throw new \RuntimeException(sprintf('Cannot resolve "%s", key "%s" does not exist', $path, $key)); } } $ref = &$ref[$key]; } else { throw new \RuntimeException(sprintf('Cannot resolve "%s", key "%s" is not an array', $path, $key)); } } return $ref; } Ukázka použití: // pokusna cesta $cesta = 'barvy.0.sub_array.seznam_barev'; // pokusne pole $pole = array( 'barvy' => array( array( 'sub_array' => array( 'seznam_barev' => array('foo', 'bar'), ), ), ), ); // nacist hodnotu print_r(resolveArrayPath($pole, $cesta)); // vypise: Array ( [0] => foo [1] => bar ) // zmenit hodnotu $seznamBarev = &resolveArrayPath($pole, $cesta); $seznamBarev = array('nove', 'pole'); // vypsat zmenene pole print_r($pole); Výsledek: Array ( [barvy] => Array ( [0] => Array ( [sub_array] => Array ( [seznam_barev] => Array ( [0] => nove [1] => pole ) ) ) ) ) |
||
Časová prodleva: 10 let
|
0