Autor Zpráva
Timo
Profil *
Zdravím, mám dotaz ohledně porovnávání obsahu pole s databází:

dejme tomu, že mám nějaké pole s názvy zeleniny:

$zelenina = array ("mrkev", "celer", "brambory")


a v databázi mám například tabulku, kde jsou následující údaje:

název ks
Mrkev 10
celer 2
rajče 3

A jde mi o to, jak docílit toho, aby se to pole porovnalo se záznamem v databázi a aby se u záznamů, které budou souhlasit objevil počet kusů. U těch, které souhalsit nebudou se neobjeví nic.

Tuším, že to bude nějak přes foreach, ale zkouším to už několik hodin a nic :( Poradíte? Díky
Hugo
Profil
Můžeš použít dotaz

select * from `zelenina` where `Nazev` IN ('Mrkev', 'Celer', 'Brambory')

a potom ke každé zelenině z pole přiřadit počet kusů z db.

while ($data = MySQL_Fetch_Assoc($res))
{
if (In_Array($data['Nazev'], $zelenina))
{
// prirazeni poctu kusu
}
}
Timo
Profil *
Hugo: díky, tak tohle mě nenapadlo, vyzkouším
Timo
Profil *
no, ještě když na to koukám... Když jsem psal, že se neobjeví nic, tak jsem myslel, že se nebude vypisovat žádný záznam z databáze, ale ta zelenina bude vypsaná (například textem s jinou barvou), ale bez počtu kusů. špatně jsem se vyjádřil.

Takže pokud dám dohromady pole a tabulku, mělo by vyjít zhruba tohle:

Mrkev: 10ks
Celer: 2ks
Brambory (ty by měly být jinou barvou).

Nejsem si tedy jist, jestli je tohle řešení úplně to nejlepší..
Hugo
Profil
Timo

Tak si nějak označ ty prvky pole, které byly nalezeny v db a nakonec vypiš nenalezené položky.
Timo
Profil *
nevím nevím... Pořád na to nemůžu přijít.

Nejde mi o zobrazení všech údajů z databáze, ale o zobrazení všech prvků z pole - u těch, které jsou v DB uloženy chci zobrazovat i ty kusy, ty, které v DB nejsou chci zobrazit jen název...

Udělat to obráceně (tedy vypsat všechny názvy z DB a u těch, které jsou v poli vypsat kusy mi jde, ale to není to, co chci)... Takže nevím

Začínám bát celkem zoufalý :(
nightfish
Profil
$zelenina = array ("mrkev", "celer", "brambory");

$result = mysql_query("select * from zelenina");
while ($data = mysql_fetch_row($result)) {
list($nazev, $ks) = $data;
if (in_array($nazev, $zelenina)) {
echo "$nazev $ks<br>";
} else echo "$nazev<br>";
}
tiso
Profil
Timo dá sa to tak že zrušíš prvok poľa pomocou unset ktorý si už vypísal z DB a na záver vypíšeš to čo zostalo z poľa cez foreach...
Prípadne si prvky z DB ulož do druhého poľa a potom pracuj z poľami...
tiso
Profil
nightfish - to Tvoje nefunguje tak ako chcel...
tiso
Profil
nightfish - to Tvoje nefunguje tak ako chcel...
Timo
Profil *
tiso: nešlo by to i s příkladem, nějak přesně nevím, jak to myslíš
tiso
Profil
Timo tak ten prvý spôsob, úprava kódu od nightfish-a

$zelenina = array ("mrkev", "celer", "brambory");
$result = mysql_query("select * from zelenina");
while ($data = mysql_fetch_row($result)) {
list($nazev, $ks) = $data;
if (in_array($nazev, $zelenina)) {
echo "$nazev $ks<br>";
$keys=array_keys($zelenina, $nazev);
$key=$keys[0];
unset $zelenina[$key];
}
foreach($zelenina as $val){//prvky ktore neboli v databaze
echo $val.'<br>';
}
Timo
Profil *
tiso nechce mi to fungovat, vždy se zobrazí jen bílá stránka (ani žádná chybová hláška). Nejsem teď doma, takže nemám čas to pořádně zkontrolovat, ale snad to bude mnou :)

Jinak díky za radu
nightfish
Profil
tiso
pravdu máš, pochopil jsem to přesně opačně než to má být
Timo
Profil *
tiso tak moc děkuju, chybělo tám pár závorek, ale funguje to skvěle. Jsem zauzlován.

Teď už mě čeká poslední část téhle záludnosti:

to původní pole $zelenina se nakonec musí načítat z řetězce, což znamená, že přes tohle:


$zelenina =explode(", " ,$string);


rozložím string na jednotlivou zeleninu do pole, které se ovšem nechová jako


$zelenina = array ("mrkev", "celer", "brambory");


Takže teď je otázka, jak rozložený string přes explode() dostat do toho kódu nahoře.

Pročítal jsem manuál a různě to hledal po netu, ale zatím jsem na nic nenarazil, pokud někdo ví, tak ať se prosím podělí.

Díky moc všem
Timo
Profil *
ještě dodatek, když použiji pole vytvořené pomocí explode(), tak se mi kusy zobrazí pouze u prvního názvu, dále už se to chová, jakoby by názvy nebyly v DB nalezeny...

Snad někdo poradí
krteczek
Profil
a odstranil jsi všechny prázdné znaky z řetězce? Třeba nějak takhle:
$string = strtr($string, array(" " => '', "\n" => '', "\r" => '');
PS: opraveno, ztratili se zpětná lomítka
tiso
Profil
Timo aha, unset() - stáva sa...
daj si vypísať ten reťazec, odriadkovanie môže byť problém, ako písal krteczek, ešte môže byť problém že tam máš viac alebo žiadnu medzeru za čiarkou, radšej by som to robil takto:

$zelenina =explode(",", trim($string, " \t\n"));//trim odstrani biele znaky
Timo
Profil *
tiso, krteczek - díky moc, trim() jsem měl sice na tento string použitý už jinde, ale zapomněl jsem že jsem o pár řádků v kódu použil v explode jako rozdělovač <br />, což bylo jen provizorní řešení a v tom byl zakopaný pes. Když jsem <br /> nahradil \r\n, tak vše funguje tak, jak má.

Díky všem
Toto téma je uzamčeno. Odpověď nelze zaslat.