Sessions – vícerozměrné pole
- Kcko
- Člen | 470
Ahoj,
jak do Nette\Sessions ukládat vícerozměrné pole? Pokud se o to pokusím
dostávám tuto hlášku (http://bit.ly/2CcnL46)
Vyřešil jsem to pak jednou úrovní a zahashovaným klíčem, který právě
spojuje 2 úrovně pole do 1, ale není to to, co sem chtěl použít.
- GEpic
- Člen | 566
Zkus:
$section->{$item->item_id}[$amount] = [ /* tvoje data */ ];
Problém je totiž v tom, že tobě se to zdá jako klasická práce
s polem, jenže ve skutečnosti pracuješ s objektem implementujícím
ArrayAccess
, takže v tvém případě se volá metoda
offsetGet
(když zapíšeš $section['d']
– zavolá
se offsetGet('d')
), ta následně volá magickou metodu
__get
, která sice vrací referenci (&__get
), no
bohužel – offsetGet
už to nedělá, takže se ti vrátí pouze
data, ale jejich jakákoliv modifikace je zbytečná, protože nejsou navázány
(reference) na svůj původ, a tudíž pokud by ti nevyskočila notice, tak by
si se divil, proč se tvoje změny do pole neprojevují.
Každopádně, měl bych víc otázek – jako třeba proč to řešíš tímto způsobem, ale už je moc hodin :D.
Editoval GEpic (1. 9. 2018 1:18)
- Kcko
- Člen | 470
GEpic napsal(a):
Zkus:
$section->{$item->item_id}[$amount] = [ /* tvoje data */ ];
Problém je totiž v tom, že tobě se to zdá jako klasická práce s polem, jenže ve skutečnosti pracuješ s objektem implementujícím
ArrayAccess
, takže v tvém případě se volá metodaoffsetGet
(když zapíšeš$section['d']
– zavolá seoffsetGet('d')
), ta následně volá magickou metodu__get
, která sice vrací referenci (&__get
), no bohužel –offsetGet
už to nedělá, takže se ti vrátí pouze data, ale jejich jakákoliv modifikace je zbytečná, protože nejsou navázány (reference) na svůj původ, a tudíž pokud by ti nevyskočila notice, tak by si se divil, proč se tvoje změny do pole neprojevují.Každopádně, měl bych víc otázek – jako třeba proč to řešíš tímto způsobem, ale už je moc hodin :D.
Ahoj, díky za obsáhlou odpověd, myslel jsem si, že to budě něco takového, proto jsem to vyřešil tak jak jsem psal.
Vyzkouším tvůj zápis i když teda mohlo by se to chovat lépe a intuitivněji (přiřazení do sesny).
Proč to řeším tímto způsobem?
Chci ukládát unikátní ID produktu a ID velikosti a k tomu počet kusů, takže jakou jinou strukturou to udělat?
Výsledné pole má tedy podle mě vypadat takto:
<?php
$products[1][20] = ['quantity' => 1, productInfo => $nejakyActiveRow]; // produkt 1, velikost 2, mnozstvi 1
$products[1][27] = ['quantity' => 5, productInfo => $nejakyActiveRow]; // produkt 1, velikost 27, mnozstvi 5
?>
Nechci tu polemizovat o tom, ze kombinace produktu a velikosti ma mit nejaky unikatni klic (treba EAN), proste je tohle za mě standardní struktura se kterou nativní SESSION nemá problém a já sem to neuměl v Nettí SESSION zapsat.
EDIT: ten krkolomnejší zápis funguje, díky :), ale stejně mi to přijde takové makové ;)
Editoval Kcko (1. 9. 2018 12:21)
- Kcko
- Člen | 470
GEpic napsal(a):
@Kcko je tu ještě jedno řešení, které je ale ukecanější – ale je to klasická práce s polem.
$tempData = $section[$item->item_id]; $tempData[$amount] = [ /* tvoje data*/ ]; $section[$item->item_id] = $tempData;
Jasně rozumím, podstatu problému jsi mi vysvělil už v 1 příspěvku :), díky samozřejmě.