Como saber si tienes un diccionario o una lista en PHP

A veces, en casos muy concretos, es interesante saber si un array es asociativo o es una mera lista de elementos.

La diferencia entre tener un array asociativo (o mapa/diccionario/…), y una mera lista de elementos, es que no hay claves para acceder a los valores.

Básicamente, la diferencia expresada en código sería:

<?php
$asociativo = array ("key1" => "value1", "key2" => "value2", "keyN" => "valueN");
$lista      = array ("value1", "value2", "valueN");

Aunque uno pueda pensar que es sencillo saber si un array es un diccionario o es una lista, no existe ninguna función en PHP (al menos no la he encontrado), que te de esta información. Y programarlo no es demasiado complicado, pero tampoco se hace en 2 minutos.

A continuación, para el que le interese, pongo las funciones is_list y is_dict que básicamente nos dicen si un array es una lista o un diccionario (con sólo una llamada podremos diferenciarlos):

<?php
function is_list ($array)
{
    if (!is_array ($array))
      return false;
 
    $keys = array_keys ($array);
    foreach ($keys as $key) {
        if (!is_numeric ($key))
            return false;
    }
    return true;
}
 
function is_dict ($array) {
    return is_array ($array) && !is_list ($array);
}

Y como ejemplo, tras ejecutar el siguiente código:

<?php
echo "asociativo: " . (is_dict ($asociativo) ? "DICCIONARIO!" : "No diccionario...");
echo "lista: " . (is_dict ($lista) ? "DICCIONARIO!" : "No diccionario...");
echo "\n";
echo "asociativo: " . (is_list ($asociativo) ? "LISTA!" : "No lista...");
echo "lista: " . (is_list ($lista) ? "LISTA!" : "No lista...");

Se obtiene como salida:

asociativo: DICCIONARIO!
lista: No diccionario...
 
asociativo: No lista...
lista: LISTA!

Que es justo lo que queremos :)

Y aquí, el enlace con el ejemplo y las funciones para validar en PHP si un array es una lista o un diccionario.

Trackback URL

, , ,

10 Comments on "Como saber si tienes un diccionario o una lista en PHP"

  1. mau
    04/03/2011 at 7:01 am Permalink

    está buena la función, aunque si tengo un array asociativo con claves numericas me da que se trata de un array no asociativo.

Hi Stranger, leave a comment:

ALLOWED XHTML TAGS:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Subscribe to Comments