Jak na porovnávání více úrovňovích polí?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Zuben45
Člen | 268
+
0
-

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

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

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

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)

Zuben45
Člen | 268
+
0
-

@Antik tisíceré díky, opravdu jsi mi moc pomohl :)