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...
funkcia array_push
Ja myslim ze si ho nepochopil. Meni sa mu tam aj hlbka (rozmernost), alebo som to ani ja nepochopil :)
Moj navrh: Zmenit datovy model, inac povedane neukladat data jak prasa do x-rozmernych poli.
Datový model? A nějaký návrh mimo DB ?
Datovy model je to ze predtym jak napises prve pismeno programu si premyslis ze kam budes ukladat co (myslia sa premenne, polia, spojkove zoznamy, stromy, akekolvek data). Ptz to mas premyslene asi dost zle. To $arr.
Patrně jsi nepochopil dotaz, navíc tvůj kód je nefunkční, tak že těžko říct co jsi tím myslel...
je to mozne. co sa tyka kodu, je pisany z hlavy, ale mal ta skor len nejak nasmerovat nie to za teba vyriesit.
ale jednu dobru radu ti dam. ak je nejake riesenie zlozite, tak je na 99% zle.
Tak v tvém případě je pro tebe zlé všechno, nedokážeš napsat ani dva řádky kódu
dolezite je, ze ty to dokazes.
Nedokážu, proto jsem tady.. ale neradím někomu když tomu nerozumím..
Zatím jsi nenapsal, o co se vlastně snažíš. Radí ti dobře oba. Máš si to nejdřív promyslet a pak začít něco kódit.
Já to pole nevytvářel, pouze musím navázat na to co už existuje... A otázka je snad jasná, nebo ne když se tak dívam tak ne pro všechny...
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?
Ne, nic si nezničím, od toho je tam ten další klíč...
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.
Tak si to dump-ni , uvidíš, že tam bude vše potřebné..
var_dump($arr);
No tak sem pastni ten var_dump vypis, nech nam je jasne konecne ze jak tam mas tie data.
var_dump($arr);
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.
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]
Jak zabranis tomu aby kluc nebol 'FOO' ? Neni uzakonene ze kluc moze byt len 'a' alebo 'b'.
Najlepsie riesenie na ten tvoj problem je tresnut po hlave tomu kto vymyslel to multidimenzionalne pole, a opravit ten kod ktory ho vytvara tak aby vytvaral pole normalne :)
Aha Zajímavý úkol. Napadá mě, co kdyby ses rekurzivně zanořoval až na poslední úroveň (tedy dokud existují v poli 3 klíče) a při vynořování bys generoval jednotlivé pole?
Staci lehce pozmenit prvni priklad z 1019126 tak aby to nehledalo zaroven i podle hodnoty (v parametrru funkce search a pak v te druhe podmince) a melo by to fungovat.
Edit: tak ne, to je trochu neco jineho na vystupu.
Ale jo, něco na ten způsob. Na konci funkce místo return $results vytvořit nové pole, kde budou položky FOO a BAR z té dané úrovně.
Pekne reseni. Pokud to dobre chapu, tak predpoklad zde je, ze klice v $arr a jim odpovidajici hodnoty v $dis musi mit vsude stejnou posloupnost? Jinak receno postupna uroven zanorovani v $arr musi byt stejna jako je v $dis.
Tak si zadal ty to zadanie.
Nevysvetlil si jak sa chces podla kluca 'a','x','y' dostat k polu ['a','b','f','t','y']. Alebo co tam mas skutocne za polia.
Ja jsem nic nezadal , take nevim jak to Marrek presne myslel. Mozna ze mu to losovo reseni bude stacit. Jen se ptam, jestli jsem ten losuv kod dobre pochopil, protoze je to zajimave reseni a nemam kde si ho ted vyzkouset.
Jaj sorry, sa mi poplietli nicky :)
Ano je to pekne riesenie a funguje tak jak pises.
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
a z navratovej hodnoty pouzijes results['FOO'] a results['BAR'] a zbytok zahodis, ptz v results bude aj to podpole ktore nechces.
Áno, je to tak. Keď na to pozerám teraz za denného svetla, tak po správnosti by malo byť:
Alebo by tam stačil aj jednoduchý foreach:
Ahoj.
co přesně dělá tento řádek, můžete prosím ten kód rozepsat do více řádků pro pochopení? Děkuji.
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...