Tłumaczenie / zastępowanie słowa - oparte na bazie danych

0

Panowie , chciałbym wykonać ów zadanie i nijak nie mam pomysłu jak do tego zasiąść. Do rzeczy, mam tabele:
uslugi
id, nazwa, opis

oraz

usluga_szczegoly
id, opis_szczegolowy, cena

załóżmy, że w tabeli usluga_szczegoly mam uzupełnione pole
id, opis_szczegolowy, cena
1, protetyka, 1500 zł
2, zabieg, 100 zł

oraz w tabeli uslugi mam uzupełnione:
id, nazwa, opis
1, Zabieg stomatologiczny, dziś mamy w promocyjnej cenie protetyka oraz zabieg

wynik jaki chce uzyskać:

Zabieg stomatologiczny (uslugi.nazwa) , dziś mamy w promocyjnej cenie JEŻELI w opisie wystąpi słowo protetyka lub zabieg (słowo występujące w tabeli usluga_szczegoly.opis_szczegolowy) to do treści powinno wstawić pole z kolumny cena, czyli wynik wyglądać powinien Zabieg stomatologiczny, dziś mamy w promocyjnej cenie 1500 zł , 100 zł.

Bardzo proszę o nakierowanie mnie.

3

Jeśli masz php 8, to możesz użyć https://www.php.net/manual/en/function.str-contains.php. Jeśli nie, to możesz użyć https://www.php.net/manual/en/function.stripos.php

0

@serek rozumiem, że powinienem zrobić z tabeli usluga_szczegoly do tablicy array a następnie w wyświetleniu wyników z tabeli uslugi dla kolumny opis odwoływać się do tej tablicy ?

2

Powinieneś dodać checkbox że jest promocja lub pole id i tabele z promocjami i jesli id > 0 to pokazuje promocje, nigdy nie powinno być robione jakies porownanie na texcie gdzies cos jesli chodzi o logike.

0

@masterc źle zrozumiałeś mój cel,

mam 1 tabele którą wczytuje sobie do tablicy:

$sql = $pdo->prepare("SELECT * FROM `table1`");
$sql->execute();
$arrayTableOne = $sql->fetchAll(PDO::FETCH_ASSOC);


foreach($arrayTableOne as $v){
// będzie zawierać w tabeli rekordy: 
// Jaś
// Małgosia
// Basia
	$CreateArray[] = $v['details'];
}

następnie mam drugą tabele załóżmy nazywa się table2 gdzie wyniki sobie pobieram w pętli while , a nastepnie pole opis z tej tabeli chce porównać z wystąpieniem słów z tabeli table1

Reasumując:

while($v = $sql->fetch(PDO::FETCH_ASSOC)){
// ten rekord będzie zawierać treść opisu: Za górami za lasami był Jaś i Małgosia
echo $v['desc']  . ' i zawiera znalezione słowa . ' JAŚ, Małgosia '; 
}

Mam nadzieję , że teraz zrozumiałeś.

1

@casperii: Dostałeś przecież prawidłową odpowiedź od @serek (drugi post). Przedstawiłeś już, że masz wyciągnięte dane. Co w takim razie jeszcze potrzebujesz :)

Nie zauważyłem, że odpisywałeś :) W tej pętli:

while($v = $sql->fetch(PDO::FETCH_ASSOC)){
    $foundWords = [];
    foreach($CreateArray as $word){
        if (stripos($v['desc'], $word) !== false) {
            $foundWords[] = $word;
        }
    }
    echo $v['desc']  . ' i zawiera znalezione słowa: '.implode(',' $foundWords); 
}

dodaj jeszcze czy dane $v['desc'] zawiera interesujące Cię słowo

0

@leonpro778: kurczaki proste a ja kombinowałem jak koń pod górkę - podziękował.
Przy okazji co w sytuacji jeżeli chciałbym rozpoznać znaki małe , duże , mieszane ? Jedyne wyjście parsować je do wybranego schematu ?
I jeszcze pytanie , jeżeli chciałbym osiągnąć wynik:

echo $v['desc'] . ' i zawiera znalezione słowa . ' JAŚ ma 10 lat, Małgosia ma 15 lat ';

zatem jak ugryźć pętle foreach ?

foreach($arrayTableOne as $v){
// będzie zawierać w tabeli rekordy: 
// Jaś
// Małgosia
// Basia
   $CreateArray[]['details'] = $v['detail'];
   $CreateArray[]['age'] = $v['age'];
}

z góry dzięki

1

@casperii: Tak samo tyle, że bardziej rozbuduj tablicę :)

$createArray[] = [
    'detail' => $v['detail'],
    'age' => $v['age'],
];

Później w pętli będziesz miał dostęp do tych danych, które musisz jednak obrobić inaczej:

$foundWords = [];
foreach($CreateArray as $word){
    if (stripos($v['desc'], $word['detail']) !== false) {
        $foundWords[] = $word['detail'].' ma '.$word['age'].' lat';
    }
}
echo implode(', ', $foundWords);
0

@leonpro778: jeszcze takie pytanie , bo kombinuje z stripos i strpos ale chyba inaczej trzeba się do tego zabrać. Mianowicie żeby nie brało słowa ADA w słowie ADAM oraz żeby brało pod uwagę rekordy dwóczłonowe a nie 2x pojedyńcze , tzn.. jeżeli w bazie miałbym ADAM JAN , to żeby wyświetliło ADAM JAN a nie osobno ADAM i osobno JAN

0
  1. Możesz użyć regexpa, żeby sprawdzać, czy dane słowo występuje w zdaniu i nie jest substringiem.
  2. Możesz podzielić zdanie na osobne słowa i potem po prostu każde słowo sprawdzać osobno, czy jest takie jakie szukasz. https://www.php.net/manual/en/function.strcasecmp.php.
0

@serek: kombinuje z preg_match, no i prawie idealnie ale to prawie:

$foundWords = [];
foreach($CreateArray as $word){
    
    if( preg_match('/'.$word['detail'].'{1,}/', $v['desc'], $match) ){
        $foundWords[] = $match[0].' ma '.$word['age'].' lat';
    }
}
echo implode(', ', $foundWords);

Problem jest , że widzi ADA w słowie ADAM czyli wyświetla , ADAM, ADA. Oczywiście słowo ADAM i ADA występuje w bazie w tabeli 2, ale tu chodzi o pokazywanie tylko tych imion które występują w przeszukanym tekście.

0

Musisz dodać w wyrażeniu, że przed i po wyrazie nie ma innych liter. Albo użyć znaków ^ i $ żeby zaznaczyć, że szukana fraza ma się znajdować na samym początku i końcu danego tekstu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1