Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Przeszukiwanie tablicy
Forum PHP.pl > Forum > Przedszkole
kkpre
Chcę zrobić nieco bardziej rozbudowaną wyszukiwarkę wartości wprowadzonej przez użytkownika w jakiejś tam tablicy.
Wiem że istnieją funkcje in_array i array_search ale nie zadowalają mnie one.

Załóżmy że mam taką tablicę:
Kod
$tablica = array('brzoskwinia','winogrona','banan','truskawka','ananas','banan');


i teraz jeżeli użyłbym zwykłej funkcji in_array()

Kod
$string = 'banan';
echo in_array($string,$tablica);

Powyższy kod zwróciłby mi jedynie "1" - czyli że znalazł 'banan' w tej tablicy
Więc mógłbym tylko rozpoznać czy 'banan' występuje w tablicy czy nie.. i potem ewentualnie działać coś dalej.

Rozbudowa, o której pisałem wcześniej polegałaby na tym że:
1. funkcja będzie zwracać pozycję i znalezioną wartość
2. nie będzie zwracać uwagi na wielkośc liter (jak spróbuje wyszukać Banan za pomocą funkcji in_array to zwróci mi 0 bo nie ma 'Banan' tylko 'banan')
3. będzie zwracać wyniki jeśli $string będzie się zawierać, w którejś wartości z tablicy

Obecnie 2 pierwsze punkty mam z głowy bo znalazłem taką funkcję

Kod
function in_array_modifed($string, $array) {
  return preg_grep('/^' . preg_quote($string, '/') . '$/i', $array);
}

Ta funkcja nie jest wrażliwa na wielkośc liter i jeżeli wyszukam 'Banan' to zwróci mi tak samo wynik jakbym wpisał 'banan'.
Po drugie nie zwraca tylko 0/1 (nie znaleziono/znaleziono) tylko zwraca mi ładną tablicę z wszystkimi znalezionymi wynikami i na którym miejscu w tablicy one się znajdują.

Przykład:
Kod
$tablica = array('brzoskwinia','winogrona','banan','truskawka','ananas','banan');
$string = 'banan';

function in_array_modifed($string, $array) {
  return preg_grep('/^' . preg_quote($string, '/') . '$/i', $array);
}
$wynik = in_array_modifed($string,$tablica);

echo "<pre>";
echo var_dump($wynik);
echo "</pre>";


zwróci:
Kod
array(2) {
  [2]=>
  string(5) "banan"
  [5]=>
  string(5) "banan"
}


Natomiast problem pojawia się przy 3 punkcie. Chciałbym aby częsciowe wyszukiwanie również działało.
Obecnie gdyby $string był równy 'ana' to funkcja nic nie zwróci bo nie ma 'ana' w tablicy.
A chciałbym żeby zwróciła wszystkie wartości, w których zawiera się ciąg 'ana'.. w tym przypadku byłoby to:
[2] => "banan"
[4] => "ananas"
[5] => "banan"

Nie wiem jak użyć strpos() w tej funkcji - bez utraty innych właściwości, które wypunktowałem wyżej.
jaslanin
wystarczy zmodyfikować preg_grep by nie dopasowywał ciągu do początku i końca stringu tj. usunąć ^$

  1. <?php
  2.  
  3. $tablica = array('brzoskwinia','winogrona','banan','truskawka','ananas','banan');
  4. $string = 'ana';
  5.  
  6. function in_array_modifed($string, $array) {
  7. return preg_grep('/' . preg_quote($string, '/') . '/i', $array);
  8. }
  9. $wynik = in_array_modifed($string,$tablica);
  10.  
  11. echo "<pre>";
  12. echo var_dump($wynik);
  13. echo "</pre>";
  14.  
  15. ?>


PS. kod php wstawiaj w tagach [ php ] a nie [ code ]
kkpre
Dzięki po raz drugi tongue.gif

ad. PS: jak brałem Podgląd postu to tag [ php ] wydawał mi się mało czytelny, ale widzę że tak nie jest wink.gif
Inaczej wygląda w podglądzie i inaczej po napisaniu postu.

Ale zapamiętam i dzięki za pomoc.

Temat do zamknięcia.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.