Jak na porovnávání více úrovňovích polí?
- Zuben45
- Člen | 268
Zdravím,
opět bych potřeboval poradit :), jelikož jsem zjistil chybu v systému
košíku, kdy se mi přepisují indexy, vypadá to že špatně porovnávám
pole v session košíku.
Mám například v košíku:
array (2)
1 => array (3)
id => "000000055700100028" (18)
pocet => 1
konfigurace => array (2)
0 => "000000338600101215" (18)
1 => "000000206900103304" (18)
2 => array (3)
id => "000000055700100028" (18)
pocet => 1
konfigurace => array (2)
0 => "000000182900100095" (18)
1 => "000000734300100013" (18)
Ovšem když přidám nový produkt s konfigurací (mám rozdělené, produkty s a bez konfigurace kvůli napárování na Systém firmy) tak se mi přepíše druhá položka.
Funkce pro kontrolu zdali položka se stejnou konfigurací existuje (v tom případě akorát přičte počet) a popřípadě vytvoří novou:
public function addKonfigurace($id,$konf,$count = 1){
$exist = false;
foreach($this->getKonfiguraceItems() as $key=>$k){
if($k['id'] == $id){
if(count($konf) == count($k['konfigurace'])){
if($k['konfigurace'] === $konf){
$exist = true;
$this->cartK[$key] = array(
'id' => $k['id'],
'pocet' => $k['pocet'] + $count,
'konfigurace' => $k['konfigurace']
);
}
}
}
}
if($exist == false){
if(empty($konf)){
$this->add($id,$count);
}else{
if(empty($this->getKonfiguraceItems())){
$key = 0;
}else{
$keys = array_keys($this->getKonfiguraceItems(), max($this->getKonfiguraceItems()));
$key = $keys[0];
}
$index = $key+1;
$this->cartK[$index] = array(
"id" => $id,
"pocet" =>$count,
"konfigurace" => $konf
);
}
}
}
Můžete mi prosím poradit co dělám špatně, popřípadě poradit jak správně porovnávat mezi více urovnovích polí ? Děkuji
Editoval Zuben45 (3. 2. 2016 20:29)
- Martk
- Člen | 661
Neměl by vypadat tenhle kód
$keys = array_keys($this->getKonfiguraceItems(), max($this->getKonfiguraceItems()));
takhle?
$key = max(array_keys($this->getKonfiguraceItems())) + 1;
max nehledá maximální hodnotu v klíčích.
Ještě lépe by to vypadalo takhle:
$this->cartK[] = [
"id" => $id,
"pocet" =>$count,
"konfigurace" => $konf
];
Editoval Antik (3. 2. 2016 20:46)
- Zuben45
- Člen | 268
Antik napsal(a):
Neměl by vypadat tenhle kód
$keys = array_keys($this->getKonfiguraceItems(), max($this->getKonfiguraceItems()));
takhle?
$key = max(array_keys($this->getKonfiguraceItems())) + 1;
max nehledá maximální hodnotu v klíčích.
Děkuji, vyzkouším :)
Ještě lépe by to vypadalo takhle:
$this->cartK[] = [ "id" => $id, "pocet" =>$count, "konfigurace" => $konf ];
No tohle jsem právě zkoušel, ale vždy se mi uložila pouze jedna položka, zkrátka se key vždy přepsal.
EDIT: Tak přidávání nového klíče funguje, děkuji @Antik , ovšem nyní se mi přidají stejné položky, místo toho aby se upravili když mají stejné id a parametry (+1).
EDIT2: Zdá se že vyřešeno, ještě provedu několik testů (hodně, pro jistotu :) ), jinak dalo by se lépe vyřešit to vyhledávání ?
Napadlo mě něco takového:
public function searchInKonfigurace($konf){
$stat = TRUE;
foreach($this->getKonfiguraceItems() as $key=>$k){
foreach($k['konfigurace'] as $k2=>$n){
if(!array_search($n, $konf)){
$stat = FALSE;
}
}
}
return $stat;
//\Tester\Assert::equal($expected, $actual)
}
public function addKonfigurace($id,$konf,$count = 1){
$exist = false;
foreach($this->getKonfiguraceItems() as $key=>$k){
if($k['id'] == $id){
if(count($konf) == count($k['konfigurace'])){
if(searchInKonfigurace($konf) === TRUE){
$exist = true;
$this->cartK[$key] = array(
'id' => $k['id'],
'pocet' => $k['pocet'] + $count,
'konfigurace' => $k['konfigurace']
);
}
}
}
}
...
Editoval Zuben45 (3. 2. 2016 21:05)
- Martk
- Člen | 661
Máš tam zbytečnou proměnnou, výkonnostní nedostatek a chybu.
public function searchInKonfigurace($konf){
foreach($this->getKonfiguraceItems() as $key=>$k){
foreach($k['konfigurace'] as $k2=>$n){
if(array_search($n, $konf) === FALSE){ // Když ti to vyhodí key 0, tak se vyhodnotí nesprávně
return FALSE; // Zbytečně se ti tu vyhledávalo dále, i když už víš, že to není stejné
}
}
}
return TRUE;
//\Tester\Assert::equal($expected, $actual)
}
Teď jsem si všiml, že zbytečně hledáš v celé konfigurace, když znáš s čím se to rovná a procházíš ji celou. Celý kód:
public function searchInKonfigurace($konf, array $compare) {
foreach($compare as $k2 => $n){
if(array_search($n, $konf) === FALSE){ // Když ti to vyhodí key 0, tak se vyhodnotí nesprávně
return FALSE; // Zbytečně se ti tu vyhledávalo dále, i když už víš, že to není stejné
}
}
return TRUE;
//\Tester\Assert::equal($expected, $actual)
}
public function addKonfigurace($id,$konf,$count = 1) {
foreach ($this->getKonfiguraceItems() as $key => $k) {
if ($k['id'] == $id) {
if (count($konf) == count($k['konfigurace'])) {
if (searchInKonfigurace($konf, $k['konfigurace'])) {
$this->cartK[$key] = [
'id' => $k['id'],
'pocet' => $k['pocet'] + $count,
'konfigurace' => $k['konfigurace']
];
break; // Není třeba hledat dál, nalezena shoda
}
}
}
}
}
Editoval Antik (3. 2. 2016 21:28)