Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Znajdywanie elementu w tablicy poprzez rekurencja
Forum PHP.pl > Forum > Przedszkole
gcdreak
Witam!
Stworzyłem funckje, która sprawdza, czy podana wartość występuje w tablicy.
  1. <?php
  2. function ifInArray($array,$x, $left, $right){
  3.        if($left > $right){
  4.            return false;
  5.        }else{
  6.            if($array[$left] == $x)
  7.                return true;
  8.            else
  9.                ifInArray($array,$x,$left + 1, $right);
  10.        }
  11.    }
  12.    
  13.    $i = 0;
  14.    do{
  15.        $array[] = mt_rand(-10,10);
  16.        $i++;
  17.    } while ($i < 10);    
  18.    
  19.    $x = 5;
  20.    
  21.    $left = min($array);
  22.    
  23.    $right = max($array);
  24.  
  25.    echo 'Szukana liczba to: '.$x.'<br />';
  26.    echo 'Tablica wygląda tak:<pre>';
  27.    print_r($array);
  28.    echo '</pre>';
  29.    
  30.    ifInArray($array,$x, $left, $right) ? $result ='Szukana wartość znajduje się w tablicy.' : $result = 'Wartość nie występuje w tablicy.';
  31.    echo $result;
  32. ?>

Nie wiem jednak dlaczego ciągle zwraca false?
Co jest nie tak?

Ps: To tylko w celu treningu. Wiem, że istnieją do tego specjalne funkcje;P
kipero
Chyba powinno być tak:
  1. <?php
  2. function ifInArray($array,$x, $left, $right){
  3.        if($left > $right){
  4.            return false;
  5.        }else{
  6.            if($array[$left] == $x)
  7.                return true;
  8.            else
  9.                return ifInArray($array,$x,$left + 1, $right);
  10.        }
  11.    }
  12. ?>

Zapomniałeś o return w 10 linijce i w Twoim przypadku funkcja zwracała wartość tylko, gdy szukany element był na pierwszym miejscu.
Poza tym:
  1. <?php
  2. $left = min($array);
  3. $right = max($array);
  4. ?>

Zastąp:
  1. <?php
  2. $left = 0;
  3. $right = (count($array) - 1);
  4. ?>

Funkcje min i max nie zwracają minimalnego i maksymalnego indeksu, tylko wartość.
Ponadto można tę funkcję napisać nie używając zmiennych $left i $right, ale skoro się uparłeś.
erix
A czemu wynajdujesz koło na nowo...? Przecież jest i in_array" title="Zobacz w manualu PHP" target="_manual, i array_slice" title="Zobacz w manualu PHP" target="_manual...

Cytat
Ps: To tylko w celu treningu. Wiem, że istnieją do tego specjalne funkcje;P

To nie wynajduj koła na nowo, nie marnuj czasu na coś, co zostało zrobione. Myśl nad projektem wieży, a nie budowie cegły, która i tak będzie prostopadłościanem.
gcdreak
@kipero
Dzięki za znalezienie tego o czym zapomniałem.
Jeśli chodzi o drugą część dwojego postu to zwróć uwagę na to, żę moja tablica nie zawiera kolejnych(wylosowane 10 z pośród 20) wartości i dlatego min() i max() zostały przezemnie urzyte.
@erix
Nie marnuj czasu na zaprzeczanie tego co napisałem jako (s)twierdzenie tylko pomyśl dlaczego akurat robię coś takiego.

Cytat(erix @ 8.07.2009, 18:42:23 ) *
Myśl nad projektem wieży, a nie budowie cegły, która i tak będzie prostopadłościanem.

Fraza mi się podoba, mimo, że post bez sensu;P
kipero
Cytat(gcdreak @ 8.07.2009, 20:58:32 ) *
Jeśli chodzi o drugą część dwojego postu to zwróć uwagę na to, żę moja tablica nie zawiera kolejnych(wylosowane 10 z pośród 20) wartości i dlatego min() i max() zostały przezemnie urzyte.


Tylko, że używasz zmiennej $left jako indeksu tablicy w funkcji:
  1. <?php
  2. if($array[$left] == $x)
  3. ?>

Co jeśli najmniejsza wartość wynosi np. -7? Wtedy próbujesz się odwołać do $array[-7], a indeksy w tablicy zaczynają się od 0.
gcdreak
Tak, ale nie powoduje to błędu tylko zwraca false i to działa.
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.