Yritän muodostaa SQL-kyselyn osaa alla olevista, eli tavoite olisi saada arrayjen a-e sisältö tuonne viimeiseen foreach-silmukkaan sen mukaan, miten if-lauseet sen sallivat (lonkat-array tulee siis lomakkeelta). Miten mahtaisi onnistua järkevimmin?
<?php if (empty($lonkat)) { } else { $a = array('A/A'); $b = array('A/B','B/B','B/A'); $c = array('A/C','B/C','C/C','C/B','C/A'); $d = array('A/D','B/D','C/D','D/D','D/C','D/B','D/A'); $e = array('A/E','B/E','C/E','D/E','E/E','E/D','E/C','E/B','E/A'); $lonkka = array(); if (in_array("A",$lonkat)) { $lonkka[] = $a; } if (in_array("B",$lonkat)) { $lonkka[] = $b; } if (in_array("C",$lonkat)) { $lonkka[] = $c; } if (in_array("D",$lonkat)) { $lonkka[] = $d; } if (in_array("E",$lonkat)) { $lonkka[] = $e; } $query .= " AND ("; foreach ($lonkat as $check6) { $query .= " lonkat = $check6 OR"; } $query = substr($query, 0, -2); $query .= ")"; } ?>
Kaksi peräkkäistä foreach-looppia ratkaisi ongelman.
Eli jos vaikka lomakkeelta on valittu A ja C, kyselyyn tulee, että kenttä "lonkat" saa olla "A/A", "A/C", "B/C", "C/C", "C/B" tai "C/A"?
Nykyinen ratkaisusi näyttää ihan hyvältä. Jos laitat taulukkoon $lonkka toisia taulukoita, tarvitset kyllä kaksi sisäkkäistä for-silmukkaa. Muista myös laittaa merkkijonojen ympärille heittomerkit SQL-kyselyssä.
<?php $lista = array('A', 'C', 'D'); $tiedot['A'] = array('A/A'); $tiedot['B'] = array('A/B', 'B/B', 'B/A'); $tiedot['C'] = array('A/C', 'B/C', 'C/C', 'C/B', 'C/A'); $tiedot['D'] = array('A/D', 'B/D', 'C/D', 'D/D', 'D/C', 'D/B', 'D/A'); $tiedot['E'] = array('A/E', 'B/E', 'C/E', 'D/E', 'E/E', 'E/D', 'E/C', 'E/B', 'E/A'); foreach ($lista as $ryhma) { foreach ($tiedot[$ryhma] as $tieto) { $osat[] = "tieto = '$tieto'"; } } echo implode(" OR ", $osat); ?>
Jos kysely on muotoa "tieto = a OR tieto = b OR tieto = c", saman voi kirjoittaa myös "tieto IN (a, b, c)".
<?php foreach ($lista as $ryhma) { foreach ($tiedot[$ryhma] as $tieto) { $osat[] = "'$tieto'"; } } echo "tieto IN (" . implode(", ", $osat) . ")"; ?>
Muoks. Huomasitkin saman jo itse...
Aihe on jo aika vanha, joten et voi enää vastata siihen.