empty - ¿Cómo comprobar la matriz en PHP?
get_the_category (4)
Aunque ArrayObject
implementa Serializable
, la suposición es errónea de que un objeto debe implementarlo para que sea similar a una matriz.
Ocurre justo lo contrario. Puede utilizar Serializable
para prevenir efectivamente la serialización de un objeto. Así que consideraría eliminarlo de la comprobación de la interfaz.
Además, si utiliza instanceof
sin un objeto, verá un error (fatal). Le sugiero que delegue la verificación de un objeto que es "similar a una matriz" a una función de hoja y haga que su función que es menos estricta con los tipos de entrada haga uso de ella:
function is_array_or_object_arraylike($var) {
return is_array($var)
|| (is_object($var) && is_object_arraylike($var))
;
}
function is_object_arraylike($obj) {
return $obj instanceof ArrayAccess
&& $obj instanceof Traversable
&& $obj instanceof Countable
;
}
También tenga en cuenta que incluso un objeto es similar a una matriz, no funciona con la mayoría de las funciones de matriz. Tampoco funcionaría bien con foreach
, por lo que debería describir mejor qué funciones de matriz está buscando aquí.
Lo mejor que se me ocurre es
function is_array_alike($array) {
return is_array($array) || (is_object($array) && $array instanceof ArrayAccess && $array instanceof Traversable && $array instanceof Serializable && $array instanceof Countable);
}
Ugh ¿Hay algo más bonito?
Edición: la prueba para is_object
parece innecesaria. He agregado una sección a la instancia del manual de PHP sobre eso.
Bueno, ya que usaste la palabra "bonito" en tu publicación, solo una rápida sugerencia sobre cambios estéticos para facilitar la lectura:
function is_array_or_alike($var) {
return is_array($var) ||
($var instanceof ArrayAccess &&
$var instanceof Traversable &&
$var instanceof Serializable &&
$var instanceof Countable);
}
Explicación de los cambios:
Cambio de nombre de la función: "
is_array_alike
" -> "is_array_or_alike
" solo para dejar en claro que se están probando tanto array-ness como like-ness.Cambio de nombre de parámetro / argumento:
$array
->$var
porque "$array
" ya presupone que el argumento es de tipo array.Condiciones de apilamiento y preparación para facilitar la lectura y conformidad con el estándar de codificación de Drupal: línea de 80 caracteres máx. Dado que usted es uno de los mantenedores del núcleo de Drupal, supongo que asumo que esta función podría ir a Drupal, por lo que probablemente habría hecho esto antes de comprometerse de todos modos.
Estás en lo correcto de que
is_object()
es necesario. En Java sería necesario porqueinstanceof
arrojaría un error en tiempo de compilación si el primer operando no fuera un objeto, pero justo ahora lo comprobé en PHP y no hay ningún error, solo un resultado de bool (falso).
La segunda sugerencia de paulmatthews86 es que usted proporcione un caso de uso. Es difícil dar recomendaciones si no conocemos los criterios. Por ejemplo, para tomar prestado un poco del punto de vista del paradigma de tipificación de pato, la instanceof
pruebas sería útil pero no necesariamente obligatoria o incluso completa. Si está más interesado en lo que puede hacer $var
y cómo se comporta en ciertos contextos, puede usar la reflexión para verificar la existencia de los métodos que deben invocarse más adelante, o puede probar que se comporta como se espera. cuando se pasa a las funciones de matriz. por ejemplo, ¿"funciona" con array_udiff_assoc
, array_chunk
, etc.? Si estos comportamientos son más importantes para sus casos de uso, estas pruebas podrían reemplazar la instanceof
de prueba de tipo, aunque, por supuesto, habría mucha superposición.
Espero que esto ayude. Interesado en ver lo que finalmente decide si decide publicarlo.
Hay una nueva especificación para PHP 7.3 que implementa una función is_countable
aquí https://wiki.php.net/rfc/is-countable
Basado en la especificación y para versiones anteriores de PHP, puede usar este
if (is_array($foo) || $foo instanceof Countable) {
return count($foo);
}
o también podría implementar una especie de polyfill para eso como este
if (!function_exists(''is_countable'')) {
function is_countable($c) {
return is_array($c) || $c instanceof Countable;
}
}
hay una interfaz de iterador en php http://php.net/manual/en/class.iterator.php
utilizar
function isIter($abc) {
return (is_array($abc) || $abc instanceof Traversable);
}