Autor Zpráva
Pavel Straka
Profil
Dobrý večer, rád bych požádal o radu. Potřebuji napsat skript, který mi na základě uživatelovy volby vlastností produktu ve 3 políčkách select vypíše všechny produkty, které splňují tuto uživatelem zadanou kombinaci.

Př. Uživatel zadá, že produkt má parametr A:2, parametr B:3 a parametr C:1. A nyní mám řekněme 40 produktů a potřebuji nějak elegantně (nutno bez použití DB) vypsat ty, které splňují tyto podmínky.

Je to možné vyřešit pomocí pole?

Děkuji za rady.
Majkl578
Profil
To by problém být neměl, pomineme-li, že takový kód se hůře udržuje. Stačí si vytvořit pole produktů (ideálně každý produkt bude objektem) a toto pole budeme filtrovat. K filtrování bude asi nejsnazší použít array_filter. V callbacku předávanému této funkci pak provedeme samotné filtrování dle daných kritérií a vrátíme TRUE/FALSE pokud produkt podmínkám odpovídá nebo ne.
Pavel Straka
Profil
Přiznám se, že jsem z toho trochu zmatený. Přečetl jsem si o funkci array_filter a chápu, jak funguje. Nevím, ale jak to celé aplikovat na to, že vybírám ze 3 selectů. Mohl byste mi prosím ještě někdo poradit?


Dejme tomu, že mám 3 položky:
("Název", "Šířka", "Výška", "Hloubka")
"A","60","50","40"
"B","40","50,"30",
"C","40","50","30"

a uživatel ve 3 selectech zadá 40,50,30, tudíž by se mu měly vypsat produkty B a C. Jak pro to připravit pole a jak jej pak filtrovat?


Předokládám správně, že vytvořím dvojrozměrné pole nějak takto:
$pole = Array(
      Array("nazev"=>"A","sirka"=>"60","vyska"=>"50","hloubka"=>40);
      Array("nazev"=>"A","sirka"=>"40","vyska"=>"50","hloubka"=>30);
      Array("nazev"=>"A","sirka"=>"40","vyska"=>"50","hloubka"=>30);
   );

Jestliže ano, jak pak bude vypadat filtr?
Keeehi
Profil
$uzivateluv_vstup_a = $_GET["a"];   // 40
$uzivateluv_vstup_b = $_GET["b"];   // 50
$uzivateluv_vstup_c = $_GET["c"];   // 30

$produkty = array (
array ("A","60","50","40"),
array ("B","40","50","30"),
array ("C","40","50","30")
);

foreach ($produkty as $produkt) {
    if ($produkt[1] == $uzivateluv_vstup_a && ($produkt[2] == $uzivateluv_vstup_b && ($produkt[3] == $uzivateluv_vstup_c) {
        echo $produkt[0]."<br>\n";
    }
}
Pavel Straka
Profil
Děkuju mnohokrát.
Majkl578
Profil
Pavel Straka:
jak pak bude vypadat filtr
Bylo to myšleno takto:
$pole = array(
      array('nazev' => 'A', 'sirka' =>60, 'vyska' =>50, 'hloubka' => 40),
      array('nazev' => 'A', 'sirka' =>40, 'vyska' =>50, 'hloubka' => 30),
      array('nazev' => 'A', 'sirka' =>40, 'vyska' =>50, 'hloubka' => 30),
);
 
$selectedNazev = 'A';
$selectedSirka = 60;
$selectedVyska = 50;
 
$filtered = array_filter($pole, function ($item) use ($selectedNazev, $selectedSirka, $selectedVyska) {
  return $item['nazev'] === $selectedNazev && $item['sirka'] === 60 && $item['vyska'] === $selectedVyska;
});

var_dump($filtered);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: