- ¿Cuál es la forma más eficiente de verificar si una matriz es una matriz plana de valores primitivos o si es una matriz multidimensional ?
- ¿Hay alguna manera de hacer esto sin recorrer realmente una matriz y ejecutar
is_array()
cada uno de sus elementos?
137
Respuestas:
La respuesta corta es no, no puede hacerlo sin al menos hacer un bucle implícito si la 'segunda dimensión' podría estar en cualquier lugar. Si tiene que estar en el primer elemento, simplemente lo haría
Pero, la forma general más eficiente que pude encontrar es usar un bucle foreach en la matriz, haciendo un cortocircuito cada vez que se encuentra un golpe (al menos el bucle implícito es mejor que el directo para ()):
Bucle implícito, pero no podemos hacer un cortocircuito tan pronto como se encuentre una coincidencia ...
fuente
is_multi()
optimice el código haciendoreturn count($rv)>0
Use count () dos veces; una vez en modo predeterminado y una vez en modo recursivo. Si los valores coinciden, la matriz no es multidimensional, ya que una matriz multidimensional tendría un recuento recursivo más alto.
El segundo valor de esta opción
mode
se agregó en PHP 4.2.0. De los documentos PHP :Sin embargo, este método no detecta
array(array())
.fuente
Para PHP 4.2.0 o más reciente:
fuente
array(array())
oarray(array(), array())
tampoco. En general, si una matriz interna está vacía, entonces el recuento recursivo agregará correctamente 0, haciendo que coincida con el recuento normal.Creo que esta es la forma más directa y es lo más avanzado:
fuente
Simplemente puede ejecutar esto:
Si el parámetro de modo opcional se establece en
COUNT_RECURSIVE
(o 1), count () contará recursivamente la matriz. Esto es particularmente útil para contar todos los elementos de una matriz multidimensional.Si es lo mismo, significa que no hay subniveles en ninguna parte. ¡Fácil y rápido!
fuente
if(count($tasks_by_date) !== count($tasks_by_date, 1))
!==
solía ver es que existía un subnivel. Para teorías que podrían estar buscando algo similar ... etc.!==
Puede ver
is_array()
el primer elemento, bajo el supuesto de que si el primer elemento de una matriz es una matriz, entonces el resto de ellos también lo son.fuente
if( is_array(current($arr)) ) { // is multidimensional }
Todas excelentes respuestas ... aquí están mis tres líneas que siempre uso
fuente
Esta función devolverá int número de dimensiones de la matriz (robado de aquí ).
fuente
Creo que encontrará que esta función es la forma más simple, más eficiente y más rápida.
Puedes probarlo así:
fuente
foreach($a as $v) is_array($v) ? return TRUE : return FALSE;
foreach($a as $v) return is_array($v) ? true : false;
Después de PHP 7, simplemente podría hacer:
fuente
También puede hacer una comprobación simple como esta:
fuente
Intenta lo siguiente
fuente
Incluso esto funciona
Si es falso, es una matriz de una sola dimensión. Si es verdadero, es una matriz de múltiples dimensiones .
current le dará el primer elemento de su matriz y verificará si el primer elemento es una matriz o no por la función is_array .
fuente
No uses COUNT_RECURSIVE
haga clic en este sitio para saber por qué
use rsort y luego use isset
fuente
En mi caso. Me atasqué en diferentes condiciones extrañas.
1. ° caso =
array("data"=> "name");
2. ° caso =
array("data"=> array("name"=>"username","fname"=>"fname"));
Pero si
data
tiene una matriz en lugar de un valor, la función sizeof () o count () no funciona para esta condición. Luego creo una función personalizada para verificar.Si el primer índice de la matriz tiene valor, entonces devuelve "solo valor"
Pero si el índice tiene una matriz en lugar de valor, entonces devuelve "tiene matriz"
.
Un agradecimiento especial a Vinko Vrsalovic
fuente
Creo que este es elegante (accesorios para otro usuario, no sé su nombre de usuario):
fuente
Todos los métodos anteriores son demasiado complejos para un despliegue rápido. Si una matriz es plana, probar el primer elemento debería devolver una primitiva, por ejemplo int, string, etc. Si es multidimensional, debería devolver una matriz. Por extensión, puede usar este forro rápido y ordenado.
Si esto devuelve verdadero, la matriz es multidimensional. De lo contrario, es plano. Solo para tener en cuenta, es muy raro que las matrices tengan diferentes dimensiones, por ejemplo, si está generando datos a partir de un modelo, siempre tendrá el mismo tipo de estructura multidimensional o plana que puede ser atravesada por bucles. Si no lo es, entonces lo ha creado a mano, lo que significa que sabe dónde estará todo y simplemente funciona sin necesidad de escribir un algoritmo de bucle.
fuente
array_shift()
, ya que elimina el primer elemento y también restablece las teclas numéricas. Mejor usocurrent()
si todavía te pica por una sola línea.Además de las respuestas anteriores y dependiendo del esquema de la matriz que desea verificar:
fuente
Es tan simple como
fuente
Aquí hay un buen trazador de líneas. Se itera sobre cada clave para verificar si el valor en esa clave es una matriz. Esto asegurará cierto
fuente
fuente
if (isset($array[0])) { }
. Si está seguro de que los índices de la matriz comienzan desde 0* solo a aquellas matrices con índice numérico
fuente
La función print_r nativa devuelve una cadena legible por humanos. Solo cuente las instancias de "Array".
tratar...
En mi caja, "is_multi tardó 0.83681297302246 segundos en 500000 veces"
Cortesía: Ruach HaKodesh
fuente
fuente
Sin bucles, simple y llanamente.
Funciona también con matrices asociadas, no solo matrices numéricas, que no pueden contener 0 (como en el ejemplo anterior, le daría una advertencia si la matriz no tiene un 0).
fuente