Niepoprawne zliczanie elementów tablicy

0

Potrzebuję wiedzieć dlaczego funkcja "count" niepoprawnie zlicza elementy tablicy. Wynik 9, 11, 15 oraz 25 nie odpowiadają ilości elementów tablicy. Dlaczego?
Wynik operacji to:

=================================
Array
(
    [0] => 102005
    [1] => 102013
    [2] => 102090
    [3] => 102410
    [4] => 102788
    [5] => 102127
    [6] => 102179
    [7] => 102717
    [8] => 102508
)
DLA DOMU
Naczynia drewniane
Przybory kuchenne drewniane
Artykuły domowe z drewna
Cukiernice, miski drewniane
ŚWIĘTA
Święta Bożonarodzeniowe
Święta Wielkanocne
NOWOŚCI
Wynik 9 
=================================
Array
(
    [0] => 102097
    [1] => 102100
)
<b>ZABAWKI Z DREWNA</b>
Zabawki do pchania i ciągnięcia
Wynik 11 
=================================
Array
(
    [0] => 101995
    [1] => 101996
    [2] => 101997
    [3] => 101999
)
SKRZYNKI z drewna, POJEMNIKI z drewna
Pudełka z drewna
Kufry z drewna
Kasetki, pudełka drewniane
Wynik 15 
=================================
Array
(
    [0] => 102005
    [1] => 102013
    [2] => 102090
    [3] => 102410
    [4] => 102102
    [5] => 102105
    [6] => 102127
    [7] => 102179
    [8] => 102717
    [9] => 102508
)
DLA DOMU
Naczynia drewniane
Przybory kuchenne drewniane
Artykuły domowe z drewna
<b> WYROBY Z DREWNA DO DECOUPAGE</b>
Galanteria z drewna do decouage
ŚWIĘTA
Święta Bożonarodzeniowe
Święta Wielkanocne
NOWOŚCI
Wynik 25 

Kod skryptu

try {
    $db_server = 'localhost';
    $db_name = 'admin_galanteria-drewniana';
    $db_user = 'admin_localhost';
    $db_passwd = 'localhost';

    $db_pdo = new PDO(
        "mysql:host=$db_server;dbname=$db_name",
        $db_user,
        $db_passwd,
        [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"]
    );

    $db_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    #wyciągnięcie kategorii
    $wynik = $db_pdo->query("
    SELECT id, rozmiar
    FROM oferta
    WHERE towar IS NULL
    ORDER BY id ASC;");

    while ($katWiersz = $wynik->fetch()) {
        $kat[] = $katWiersz;
    }


    $wynik = $db_pdo->query("
    SELECT id, towar, tresc, cena, wartoscir, tak
    FROM oferta
    WHERE kategoria2 = 'sta' OR kategoria2 = 'pro'");

    print "ID;TYTUŁ;OPIS;CENA;KATEGORIE;AKTYWNY;ZDJECIA".PHP_EOL;

    $qqq = [];

    while ($wiersz = $wynik->fetch()) {

        $katProd = explode(' ', $wiersz['wartoscir']);
        print str_repeat('=', 33).PHP_EOL;
        print_r($katProd);

        # podmiana ID na nazwy kategorii
        foreach ($katProd as $pozycja) {
            
            foreach ($kat as $katWiersz) {
                
                if ($pozycja == $katWiersz['id']) {
                    $pozycja = $katWiersz['rozmiar'];
                    printf("%s".PHP_EOL, $pozycja);
                    $qqq[] = $pozycja;
                }
            }
        }

        $e = count($qqq);
        print "Wynik $e ".PHP_EOL;
    }    
    
    
    $db_pdo = NULL;
} catch (PDOException $e) {
    print "Błąd: ".$e->getMessage();
    die();
}
2

Ja z php'a jestem słaby, ale według mnie nie zerujesz tablicy o pięknej nazwie $qqq :] i dlatego wychodzi nieprawidłowy wynik.

0

@Xarviel: unset() załatwił sprawę, dziękuję za wskazówkę

1
Thommen napisał(a):

@Xarviel: unset() załatwił sprawę, dziękuję za wskazówkę

Ja ze swojej strony dodam, żę jeśli musisz zerować zmienne, to coś jest grubo nie tak.

Nie wystarczyłoby $qqq = [];, zamist unset($qqq)?

Bo z tego co wiem to taki unset() jest tylko w PHP.

3

Dokładnie o to mi chodziło o, czym pisze @TomRiddle.

Jak przeniesiesz tą zmienną $qqq = [] bezpośrednio do pętli to bedzie działać tak samo, ale będzie czytelniejsze.

// $qqq = []; Stąd to kasujesz

while (...) {
  // I przenosisz tutaj
  $qqq = [];
  
  // ...

  foreach (...) {
    foreach (...) {
      // ...
    }
  }

  // ...
}

Reszta kodu bez zmian.

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