Autor Zpráva
vecerapl
Profil
Sedím u toho už 3 hodiny a obracím se na Vás s prozbou o vyřešení trpaslíkového efektu :)

// vypisujeme popisy a k nem potrebujeme priradit kategorii
foreach ($vypis as $popis)
{

    $kategorie_id = "0";
    
    $vyhledavana_kategorie = sql_all("SELECT nazev,ide FROM kategorie_id");
      foreach ($vyhledavana_kategorie as $hledam)
      {
      $vyhledane_slovo = strpos($popis,$hledam[0]);
        // pokud slovo najde, zapiseme kategorii
        if ($vyhledane_slovo !== false)
        {
        $kategorie_id = $hledam[1];
        break; // ukoncime hledani
        }
      }
}


Má to hledat v $popis, kde text má přiřadit do určité kategorie, tak že mám kategorie_id, kde mám naházené různé slova. Pokud je strpos detekuje, přiřadí k tomu ID kategorie.

Bohužel nechápu jednu věc, proč když v $popis není věta o pobytu, ubytování, ale o masáži, tak to prostě hodí jako pobyt a to i přes to, že masáž patří do kategorie masáž.

Udělal jsem si i echo výpis a takhle to vypadá. Mě to už leze na mozek :( Přitom očividně u posledních dvou není v popisu zmínka o pobytu, přesto strpos to detekuje. Není to divné?


Na Šumavě je krásně ... pobyt pro 2 na 2 noci s polopenzí (24.-26.5.2011) v pensionu s bazénem a saunou
Kategorie_ID: 5 (Nalezeno slovo: pobyt - znak 28)

Na Šumavě je krásně ... pobyt pro 2 na 2 noci s polopenzí (17.-19.5.2011) v pensionu s bazénem a saunou
Kategorie_ID: 5 (Nalezeno slovo: pobyt - znak 28)

Medová masáž zad ... 60 minut ... rozkošné ... :)
Kategorie_ID: 5 (Nalezeno slovo: pobyt - znak 28)

Káva ... BORBONE RED VENDING 0,5kg zrno
Kategorie_ID: 5 (Nalezeno slovo: pobyt - znak 28)
king26
Profil
Je to proto, že na začátku to najde slovo pobyt, do $kategorie_id se zapíše pobyt ale jelikož to nic jiného nenajde, v proměnné zůstane pobyt. Máš to špatně navržené.
vecerapl
Profil
Přidal jsem ještě do kodu foreach, přes který se vypisuje popisek a ke kterým potřebuji přiřadit kategorii.
Avšak pochybuji že proměnná zůstavá pobyt. Při každém novém foreach dojde k načtení nového popisu (textu) a druhý foreach se strpos by měl hledat vesměs znovu.
meris
Profil
Co máš okolo toho skriptu?
Jinak bych ti doporučil podívát se na příkaz LIKE
vecerapl
Profil
Popis načítám z XML, tak že si jej prvně načtu přes CURL a použiji simplexml_load_string.
petr 6
Profil
vecerapl:
Při každém novém foreach dojde k načtení nového popisu (textu) a druhý foreach se strpos by měl hledat vesměs znovu.
Na základě čeho tak soudíš? Podmínka
if ($vyhledane_slovo >= "1") 
ti říká, že se to provede jen při nalezené shodě.

Taky se v tom tvém kódu a hlavně v popisu, co to má dělat, moc neorientuju, a nechce se mi nad tím sedět. Ale myslím, že nic nezkazíš, když k if na řádcích 12 až 15 přidáš
else{$kategorie_id = "";}
Jestli to bude stačit na vyřešení problému, to nevím, to by bylo potřeba vědět, jak s tím skriptem pak nakládáš (kde co vypisuješ)
Joker
Profil
vecerapl:
Při každém novém foreach dojde k načtení nového popisu (textu) a druhý foreach se strpos by měl hledat vesměs znovu.
Přesně. A když nic nenajde, vrátí false, blok IF se neprovede a v $kategorie_id zůstane to co tam bylo předtím.

Mimo téma, proč je na řádku 12 probůh číslo 1 zapsané jako řetězec, hlavně když strpos vrací číslo?

A druhá poznámka, tenhle kód řekne že nic nenašel také v případě, že se $hledam[0] bude nacházet úplně na začátku $popis.
Čili například pro $popis = "Káva ... BORBONE RED VENDING 0,5kg zrno" a $hledam[0] = "Káva" nebude nic nalezeno.

(edit: „že se $hledam[0] bude nacházet úplně na začátku $popis“, měl jsem to přehozené)
vecerapl
Profil
Joker
Pokud to nic nenajde, ma zustat radek 5, tedy $kategorie_id = "0";
Řádek 12 bych upravil na if ($vyhledane_slovo !== false), avšak problém to stále nevyřeší :(
Nemáš nějaké scriptovací řešení?
petr 6
Profil
Možná by nebylo od věci zamyslet se nad tím, co vlastně chceš, aby to dělalo, a navrhnout nějaké efektivnější řešení.
vecerapl
Profil
petr 6:
Potřebuji jediné. Přiřadit POPIS ke kategorii. Přiřaření je závislé na uložených slovech v mySQL, kde v případě identifikace tohoto slova v POPIS se vypíše IDE daného slova, což ve výsledku bude identifikační číslo kategorie, které se pak k danému POPIS přiřadí.
petr 6
Profil
vecerapl:
je závislé na uložených slovech
identifikace tohoto slova
které se ... přiřadí

Právě tyto obecné fráze by bylo dobré lépe popsat.
vecerapl
Profil
Ubytování (ID=5) = ubytování, pobyt, hotel

Pokud tedy budu mít větu, která bude obsahovat některá slova, tak tuto větu přiřadíme ke kategorii Ubytování ID=5. Pokud však věta nebude obsahovat žádná slova, dáme mu ID=0

Kategorii je více, tohle je pouze příklad. Mám zde kategorie Zdraví, Relaxace apod.
Joker
Profil
vecerapl:
A pokud bude obsahovat více slov, dostane jaké ID?
Kód popsaný výše funguje tak, že pokud obsahuje více slov, dostane ID toho posledního. Pokud neobsahuje žádné, dostane poslední uložené ID (tj. stejné jako minulá kategorie, nebo 0, pokud je první)

Dál je zbytečné ten (úplně stejný) SQL dotaz dělat v každém cyklu znovu.
No a další problém je, že shoda řetězce není shoda toho slova. Například kdyby nějaká kategorie byla „byt“, spadne tam i „pobyt“, „ubytování“, stejně jako „nábytek“ a „bytelné“ věci.

Jinak bych to asi řešil tak, že na začátku udělám mapu kategorií jako pole: slovo => ID
Pak vezmu slovo a zjistím, jestli existuje mapa[slovo]. Pokud ano, mapa[slovo] je ID, jinak ID=0.
vecerapl
Profil
Ano kazde slovo ma svoje ID kategorie. Jenze otazka je, jak to tedy naprogramovat.

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:

0