| 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: 12 let
|
|||
0