Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Poradí někdo jak vytvořit pole z pole v PHP

Ahoj, mám takové pole které se mění obsahem i hloubkou

$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');

pak znám klíče pro nová pole která potřebuji vytvořit které jsou totožné s klíči které potřebuji vypsat

$dis = array('a', 'b', 'c');

a takové pole potřebuji ve finále získat

$newarr = array();
$newarr['a'] = array('FOO' => 'a',   'BAR' => 'a2');
$newarr['b'] = array('FOO' => 'ab',  'BAR' => 'ab2');
$newarr['c'] = array('FOO' => 'abc', 'BAR' => 'abc2');

Chodí sem nějaký prosík ? Díky za pomoc...

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Ja osobne si myslim ze priradenim $arr['a']['b'] = array('FOO' => 'ab', 'BAR' => 'ab2'); si znicis…
MM.. 04.06.2014 22:38
MM..
Ne, nic si nezničím, od toho je tam ten další klíč...
Marrek 04.06.2014 22:51
Marrek
Neni tam dalsi klic. Ked mas dvojrozmerne pole tak prvy rozmer je ukazatel (dereferencia) na cely dr…
MM.. 04.06.2014 23:14
MM..
Tak si to dump-ni , uvidíš, že tam bude vše potřebné.. var_dump($arr);
Marrek 04.06.2014 23:17
Marrek
No tak sem pastni ten var_dump vypis, nech nam je jasne konecne ze jak tam mas tie data.
MM.. 04.06.2014 23:23
MM..
$arr = array(); $arr['a'] = array('FOO' => 'a', 'BAR' => 'a2'); $arr['a']['b'] = array('FOO' => 'ab'…
Marrek 04.06.2014 23:36
Marrek
Takze 'FOO' a 'b' je na stejnej urovni. Ked to bude nahodou stejne (kluc = 'FOO' alebo kluc = 'BAR')…
MM.. 04.06.2014 23:50
MM..
Takze 'FOO' a 'b' je na stejnej urovni. Ked to bude nahodou stejne (kluc = 'FOO' alebo kluc = 'BAR')… nový
Marrek 05.06.2014 00:02
Marrek
Jak zabranis tomu aby kluc nebol 'FOO' ? Neni uzakonene ze kluc moze byt len 'a' alebo 'b'. Najleps… nový
MM.. 05.06.2014 00:49
MM..
Aha :i: Zajímavý úkol. Napadá mě, co kdyby ses rekurzivně zanořoval až na poslední úroveň (tedy doku…
Niko Bellic 04.06.2014 23:51
Niko Bellic
Staci lehce pozmenit prvni priklad z 1019126 tak aby to nehledalo zaroven i podle hodnoty (v paramet… nový
navay 05.06.2014 00:03
navay
Ale jo, něco na ten způsob. Na konci funkce místo return $results vytvořit nové pole, kde budou polo… nový
Niko Bellic 05.06.2014 00:12
Niko Bellic
$newarr = array(); $oldkey = NULL; while ($key = array_shift($dis)) { if ($oldkey !== NULL) unset($n… nový
los 05.06.2014 00:28
los
Pekne reseni. Pokud to dobre chapu, tak predpoklad zde je, ze klice v $arr a jim odpovidajici hodnot… nový
navay 05.06.2014 01:36
navay
Tak si zadal ty to zadanie. Nevysvetlil si jak sa chces podla kluca 'a','x','y' dostat k polu ['a','… nový
MM.. 05.06.2014 01:47
MM..
Ja jsem nic nezadal ;-), take nevim jak to Marrek presne myslel. Mozna ze mu to losovo reseni bude s… nový
navay 05.06.2014 02:49
navay
Jaj sorry, sa mi poplietli nicky :) Ano je to pekne riesenie a funguje tak jak pises. nový
MM.. 05.06.2014 02:55
MM..
Ked to ma byt uplne nahodne a hladas prvy vyskyt kluca, tak potrebujes pre kazdy znak z $dis prehlad… nový
MM.. 05.06.2014 01:56
MM..
t.j. upravene to rekurzivne hladanie na hladanie vyskytov kluca a ne hodnoty function search($array… nový
MM.. 05.06.2014 02:18
MM..
Áno, je to tak. Keď na to pozerám teraz za denného svetla, tak po správnosti by malo byť: while (($… nový
los 05.06.2014 09:33
los
Ahoj. $newarr[$oldkey = $key] = $arr = $arr[$key]; co přesně dělá tento řádek, můžete prosím ten k… nový
Juniorh 10.06.2014 15:03
Juniorh
$oldkey = $key; // zapamätáme si hodnotu kľúča kvôli spracovaniu v ďalšej iterácii $arr = $arr[$key]… poslední
los 11.06.2014 15:53
los
Myslim, ze nejen me by ciste ze zvedavosti zajimalo z ceho vznika takovahle struktura. Ja si totiz n… nový
navay 05.06.2014 10:13
navay

Ja osobne si myslim ze priradenim
$arr['a']['b'] = array('FOO' => 'ab', 'BAR' => 'ab2');

si znicis to
$arr['a'] = array('FOO' => 'a', 'BAR' => 'a2');

pretoze po priradeni $arr['a']['b']=neco bude to $arr['a'] ukazovat na tu dalsiu dimenziu, nie?

Jak mas tam tie data naozaj ulozene?

Neni tam dalsi klic. Ked mas dvojrozmerne pole tak prvy rozmer je ukazatel (dereferencia) na cely druhy rozmer. Si to skus alebo napis sem jasne (konkretnejsie) ze jak presne tam mas ulozene tie vstupne data. Lebo tak jak si to pisal to IMHO neni mozne aby to tak bolo ulozene.

$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');

var_dump($arr);

array(1) {
  ["a"]=>
  array(3) {
    ["FOO"]=>
    string(1) "a"
    ["BAR"]=>
    string(2) "a2"
    ["b"]=>
    array(3) {
      ["FOO"]=>
      string(2) "ab"
      ["BAR"]=>
      string(3) "ab2"
      ["c"]=>
      array(2) {
        ["FOO"]=>
        string(3) "abc"
        ["BAR"]=>
        string(4) "abc2"
      }
    }
  }
}

Takze 'FOO' a 'b' je na stejnej urovni. Ked to bude nahodou stejne (kluc = 'FOO' alebo kluc = 'BAR') tak si prepises zaznam kluca. To ti nevadi?
Jake mas skutocne realne data? Ne foo a bar.

Dereferencovat to mozes pomocou cyklu, v ktorom si vyberes vzdy dalsi podkluc. Napr.

$deref = $arr
a cyklus pre kazdy prvok z $kluce
{
$deref = $deref[prvok_z_kluce];
$newarr[prvok_z_kluce]['FOO'] = $deref['FOO'];
$newarr[prvok_z_kluce]['BAR'] = $deref['BAR'];
}

apod. Pisem zhlavy tak si to skus, neviem nabeton ci to takto presne pojde tak jak chces.

P.S. a nemozes napisat $newarr[prvok_z_kluce] = $deref, pretoze to nemas oddelene od dalsich podpoli, ale mas tam totalny datovy maglajz. preto priradujem po jednom tie prvky.

Takze 'FOO' a 'b' je na stejnej urovni. Ked to bude nahodou stejne (kluc = 'FOO' alebo kluc = 'BAR') tak si prepises zaznam kluca. To ti nevadi?

Eh, zajímavý postřeh, asi jsem už unavený, nic méně k tomu by ale nemělo nikdy dojít, ne? jelikož by se to mělo volat vždy s [FOO] nebo [BAR]

Ked to ma byt uplne nahodne a hladas prvy vyskyt kluca, tak potrebujes pre kazdy znak z $dis prehladat cele to pole (nedestruktivne) a hladat prvy vyskyt. T.j. vnorene cykly alebo rekurzivna funkcia ktora prehlada cele pole, a zavolas ju pre kazdy z tych znakov z $dis.

P.S> na prehladavanie pola si uz daval vyssie link, tak si to len trochu uprav.

t.j. upravene to rekurzivne hladanie na hladanie vyskytov kluca a ne hodnoty

function search($array, $key)
{
    $results = array();

    if (is_array($array)) {
        if (isset($array[$key])) {
            $results[] = $array[$key];
        }

        foreach ($array as $subarray) {
            $results = array_merge($results, search($subarray, $key));
        }
    }

    return $results;
}

a z navratovej hodnoty pouzijes results['FOO'] a results['BAR'] a zbytok zahodis, ptz v results bude aj to podpole ktore nechces.

Myslim, ze nejen me by ciste ze zvedavosti zajimalo z ceho vznika takovahle struktura. Ja si totiz nedokazu predstavit na co to realne aplikovat. Trosku to pripomina system adresaru a souboru, kdy by mohlo mit nejaky vyznam to razeni podle abecedy. Hloda mi to v hlave :-), prozrad prosim Marrku k cemu to slouzi, z ceho to vznika, nebo nejaky realnejsi uryvek dat z toho pole...

Zpět do poradny Odpovědět na původní otázku Nahoru