Autor Zpráva
ja99
Profil *
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
Postup by snad měl jít pochopit z tohoto příspěvku: Jak vytvorit z retezce nazev multidimenzionalniho pole
ShiraNai7
Profil
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
                                )

                        )

                )

        )

)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0