array_is_list în PHP 8.1 (Verificarea Listelor Secvențiale) în PHP

Tablouri (array) PHP 8.1+

Cum verifici nativ dacă un tablou PHP este o listă curată indexată numeric de la 0 la N-1 sau un dicționar asociativ, esențial pentru serializare JSON.

Sintaxă
if (array_is_list($date)) { echo json_encode($date); /* [] array */ }

În limbajul PHP, tipul de date array este o structură hibridă: poate funcționa atât ca o listă indexată secvențial (vector de tip [0, 1, 2]), cât și ca o tabelă hash asociativă (dicționar cu chei de tip șir ['id' => 1, 'nume' => 'Ion']).

Această flexibilitate creează probleme majore la serializarea în format JSON: un tablou indexat numeric dar ale cărui chei nu încep de la 0 sau au goluri (de exemplu, după ștergerea unui element cu unset()) va fi serializat de json_encode() ca un obiect JSON ({}) în loc de un tablou JSON ([]). Funcția array_is_list rezolvă instant această verificare în mod nativ C ultra-rapid.

Demonstrație: Ce este și ce nu este o listă în PHP
<?php

declare(strict_types=1);

// 1. Liste valide: cheile pornesc de la 0 și cresc secvențial cu +1
array_is_list([]);                         // true (tabloul gol este o listă)
array_is_list(['mar', 'para', 'pruna']);   // true (chei: 0, 1, 2)
array_is_list([0 => 'A', 1 => 'B']);       // true

// 2. Tablouri care NU sunt liste (sunt dicționare / array-uri asociative):
array_is_list(['nume' => 'Ion', 'varsta' => 30]); // false (chei string)
array_is_list([1 => 'A', 2 => 'B']);              // false (nu începe de la 0!)
array_is_list([0 => 'A', 2 => 'B']);              // false (lipsește cheia 1!)

// 3. Aplicație practică: garantarea serializării corecte JSON
$produse = ['Telefon', 'Laptop', 'Căști'];
unset($produse[1]); // Rămân doar cheile 0 și 2

if (!array_is_list($produse)) {
    // Reindexăm cheile pentru a forța formatul de array [] în JSON:
    $produse = array_values($produse);
}

echo json_encode($produse); // Output: ["Telefon","Căști"] (array JSON curat)

Complexitate Algoritmică

Funcția array_is_list() funcționează în O(N) în cel mai rău caz, dar se oprește (short-circuit) imediat la prima cheie care nu respectă secvența 0, 1, 2 ... N-1, oferind performanță incomparabil superioară soluțiilor scrise manual în spațiul utilizator (cum era array_keys($arr) === range(0, count($arr) - 1)).