count() nie działa poprawnie

0

Witajcie. Chciałem prosić o pomoc. Korzystam z funkcji count($tablica), ale count podaję wynik pomijając puste elementy tablicy.

np.

Mam tablicę o indeksach od 0 do 34, ale wśród 35 rekordów jest 10 pustych. Funkcja count() podaję wynik 25 w takiej sytuacji. Jaką funkcje zastosować, aby liczyła również puste elementy?

0

U mnie count() działa.

0

Chodziło o to że jak tablica ma 30 elementów, ale np 10 jest pustych to count() wyrzuca wynik 20.

Ostatecznie znalazłem coś takiego do pętli.

$ile=max(array_keys($wyrazy));
3

@up
Ale to Ci przecież nie zlicza elementów tablicy tylko pokazuje maksymalny index, który z rozmiarem tablicy ma niewiele wspólnego. W PHP "tablica" to tak naprawdę uporządkowana mapa - indeks nie określa kolejności elementów tablicy, tylko stanowi klucz w parze klucz=>wartość. count() podaje prawidłowy rozmiar tablicy, te Twoje "puste" elementy nie istnieją.

Pewnie robisz coś takiego:

$arr = [];
$arr[0] = 0;
$arr[2] = 2;
$arr[1] = 1;
$arr[5] = 5;

echo 'Rozmiar: ' . count($arr); // => 4

Elementy o "indeksach" (kluczach!) 3 i 4 nie są puste - nie istnieją, podobnie jak nie istnieje $arr['elo'].

Żeby pokazać, że index jest kluczem mapy, a nie indeksem klasycznej tablicy/vectora możesz wykonać na tej kolekcji pętlę:

foreach($arr as $item) {
   echo $item; // => 0215
}

Jak widać elementy są przetwarzane w kolejności zadeklarowania, nie wg "indeksów".

0

Dzieki ! Widzę że faktycznie mam braki teoretyczne.

W moim przypadku zamiast foreach muszę używać** for **, gdyż tematem mojego problemu są zależności między sąsiednimi elementami więc często odwołuje się do elementów tablicy o kluczach $x-1, albo $x+1 w odniesieniu do aktualnie przetwarzanego w pętli elementu o kluczu $x. Na foreachu to byłoby problematyczne, chyba że czegoś nie wiem.

0

Brzmi jak robota dla array_reduce(), zwykły for Ci niewiele da, jeśli nie masz ciągłości indeksów. Mniej elegancki, ale także działający sposób to for nie bezpośrednio po docelowej tablicy, ale po tablicy jej kluczy array_keys([$arr]), coś w tym stylu:

$keys = array_keys($arr);

for ($i = 0; $i < count($keys); $i++) {
   // poprzedni element:
   echo 'prev: ' . $arr[$keys[$i - 1]] . ' | ';
   // biezacy element:
   echo 'curr: ' . $arr[$keys[$i]] . ' | ';
   // nastepny element:
   echo 'next: ' . $arr[$keys[$i + 1]];
   echo "\n";
}
0

Wydaje się że sam chyba nie do końca wiesz co chcesz zrobić. Mówisz że masz klucze które nie są ciągłe, i mówisz że tak ma być, ale innym razem mówisz coś o kluczu mniejszym bądź większym o jeden. Nie możesz zjeść ciastka, i mieć ciastka.

Jeżeli klucze mają coś symbolizować, to nie możesz dodawać sobie czegoś do nich, albo zmniejszać ich.
Jeżeli nie muszą przechowywać żadnej informacji, to zrób array_values() albo nie twórz ich, in the first place.

PS: Być może nie chodziło Ci o index+1 lub index-1 tylko o następny i poprzedni. W takim wypadku faktycznie musisz kombinować, ale już ja bym zrobił lepiej dwie tablice. Takie hacki rzadko wychodzą udane.

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