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...

Předmět Autor Datum
funkcia array_push $newarr = array(); $a = array('FOO' => 'a', 'BAR' => 'a2'); array_push($newarr['…
wam_Spider007 04.06.2014 22:17
wam_Spider007
Ja myslim ze si ho nepochopil. Meni sa mu tam aj hlbka (rozmernost), alebo som to ani ja nepochopil…
MM.. 04.06.2014 22:26
MM..
Datový model? A nějaký návrh mimo DB ?
Marrek 04.06.2014 22:28
Marrek
Datovy model je to ze predtym jak napises prve pismeno programu si premyslis ze kam budes ukladat co…
MM.. 04.06.2014 22:40
MM..
Patrně jsi nepochopil dotaz, navíc tvůj kód je nefunkční, tak že těžko říct co jsi tím myslel...
Marrek 04.06.2014 22:27
Marrek
je to mozne. co sa tyka kodu, je pisany z hlavy, ale mal ta skor len nejak nasmerovat nie to za teba…
wam_Spider007 04.06.2014 22:45
wam_Spider007
Tak v tvém případě je pro tebe zlé všechno, nedokážeš napsat ani dva řádky kódu :-)
Marrek 04.06.2014 22:54
Marrek
dolezite je, ze ty to dokazes.
wam_Spider007 04.06.2014 22:56
wam_Spider007
Nedokážu, proto jsem tady.. ale neradím někomu když tomu nerozumím.. ;-)
Marrek 04.06.2014 23:08
Marrek
Zatím jsi nenapsal, o co se vlastně snažíš. Radí ti dobře oba. Máš si to nejdřív promyslet a pak zač…
Niko Bellic 04.06.2014 23:05
Niko Bellic
Já to pole nevytvářel, pouze musím navázat na to co už existuje... A otázka je snad jasná, nebo ne k…
Marrek 04.06.2014 23:10
Marrek
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')…
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…
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…
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…
Niko Bellic 05.06.2014 00:12
Niko Bellic
$newarr = array(); $oldkey = NULL; while ($key = array_shift($dis)) { if ($oldkey !== NULL) unset($n…
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…
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','…
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…
navay 05.06.2014 02:49
navay
Jaj sorry, sa mi poplietli nicky :) Ano je to pekne riesenie a funguje tak jak pises.
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…
MM.. 05.06.2014 01:56
MM..
t.j. upravene to rekurzivne hladanie na hladanie vyskytov kluca a ne hodnoty function search($array…
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 (($…
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…
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…
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