Sessions – vícerozměrné pole

Kcko
Člen | 465
+
0
-

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 | 562
+
+1
-

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 | 465
+
0
-

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

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)

GEpic
Člen | 562
+
0
-

@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;
Kcko
Člen | 465
+
0
-

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