Tengo la siguiente matriz, que me gustaría reindexar para que las teclas se inviertan (idealmente comenzando en 1):
Matriz actual ( editar: la matriz en realidad se ve así):
Array (
[2] => Object
(
[title] => Section
[linked] => 1
)
[1] => Object
(
[title] => Sub-Section
[linked] => 1
)
[0] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)
)
Como debería ser:
Array (
[1] => Object
(
[title] => Section
[linked] => 1
)
[2] => Object
(
[title] => Sub-Section
[linked] => 1
)
[3] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)
)
Respuestas:
Si desea volver a indexar a partir de cero, simplemente haga lo siguiente:
Si lo necesita para comenzar en uno, use lo siguiente:
Aquí están las páginas del manual para las funciones utilizadas:
array_values()
array_combine()
range()
fuente
array_values
devuelve una copia de la matriz. Entonces, si tiene referencias a la matriz, entoncesarray_splice
sería mejor. Ver solución @imagiro.array_values()
haga que funcione, si comienza con el índice 0 todo el tiempo.Aquí está la mejor manera :
eso vuelve
al hacer esto
obtienes esto
Explicación
array_values()
: Devuelve los valores de la matriz de entrada e indexa numéricamente.array_filter()
: Filtra los elementos de una matriz con una función definida por el usuario (UDF si no se proporciona ninguno , se eliminarán todas las entradas en la tabla de entrada con valor FALSO ).fuente
array_filter()
parece completamente irrelevante para los datos de muestra.Me acabo de enterar que también puedes hacer un
Eso hace la reindexación en el lugar, por lo que no terminas con una copia de la matriz original.
fuente
¿Por qué reindexar? Simplemente agregue 1 al índice:
Editar Después de que se haya aclarado la pregunta: puede usar el
array_values
para restablecer el índice comenzando en 0. Luego, puede usar el algoritmo anterior si solo desea que los elementos impresos comiencen en 1.fuente
Bueno, me gustaría pensar que, sea cual sea su objetivo final, no necesitaría modificar la matriz para que esté basada en 1 en lugar de 0, sino que podría manejarla en el momento de la iteración como Gumbo publicó.
Sin embargo , para responder a su pregunta, esta función debe convertir cualquier matriz en una versión basada en 1
EDITAR
Aquí hay una función más reutilizable / flexible, si lo desea
fuente
Esto hará lo que quieras:
fuente
Es posible que desee considerar por qué desea utilizar una matriz basada en 1. Las matrices basadas en cero (cuando se utilizan matrices no asociativas) son bastante estándar, y si desea generar una salida a una interfaz de usuario, la mayoría manejaría la solución simplemente aumentando el número entero tras la salida a la interfaz de usuario.
Piense en la coherencia, tanto en su aplicación como en el código con el que trabaja, cuando piense en indexadores basados en 1 para matrices.
fuente
Una solución más elegante:
fuente
Puede reindexar una matriz para que la nueva matriz comience con un índice de 1 como este;
El resultado de lo anterior es;
fuente
array_values
aquí. Mira mi respuesta.Similar a @monowerker, necesitaba reindexar una matriz usando la clave de un objeto ...
Esto resultó en:
fuente
fuente
Si no está intentando reordenar la matriz, simplemente puede hacer:
$ array = array_reverse ($ array);
$ array = array_reverse ($ array);
El array_reverse es muy rápido y se reordena a medida que se invierte. Alguien más me mostró esto hace mucho tiempo. Por lo tanto, no puedo tomar crédito por haberlo inventado. Pero es muy simple y rápido.
fuente
Similar a la contribución de Nick, llegué a la misma solución para reindexar una matriz, pero mejoré un poco la función ya que desde la versión 5.4 de PHP, no funciona debido a que pasa variables por referencia. La función de reindexación de ejemplo es así usando el
use
cierre de palabra clave:fuente
Aquí está mi propia implementación. Las claves en la matriz de entrada se volverán a numerar con claves incrementales a partir de $ start_index.
fuente
Simplemente haz esto:
fuente
Puede hacerlo fácilmente después de usar la función array_values () y array_filter () juntas para eliminar elementos de matriz vacíos y reindexar una matriz en PHP.
Función array_filter () La función PHP array_filter () elimina elementos o valores de matriz vacíos de una matriz en PHP. Esto también eliminará los valores en blanco, nulo, falso, 0 (cero).
Función array_values () La función PHP array_values () devuelve una matriz que contiene todos los valores de una matriz. La matriz devuelta tendrá teclas numéricas, comenzando en 0 y aumentará en 1.
Eliminar elementos de matriz vacíos y reindexar
Primero veamos la salida de la matriz $ stack:
Salida:
En la salida anterior, queremos eliminar los valores en blanco, nulos, 0 (cero) y luego reindexar los elementos de la matriz. Ahora usaremos la función array_values () y array_filter () juntas como en el siguiente ejemplo:
Salida:
fuente
array_filter()
parece completamente irrelevante para los datos de muestra del OP.Eliminación duplicada y reindexar una matriz:
fuente
array_filter()
parece completamente irrelevante para los datos de muestra del OP.La forma más rápida que se me ocurre
Y si solo desea reindexar la matriz (comenzar en cero) y tiene PHP +7.3, puede hacerlo de esta manera
Creo que
array_unshift
es mejor quearray_values
ya que el primero no crea una copia de la matriz.fuente
Parece que todas las
array_combine()
respuestas están copiando el mismo "error" (la llamada innecesaria dearray_values()
).array_combine()
ignora las claves de ambos parámetros que recibe.Código: ( Demo )
Salida:
fuente
La ordenación es solo un sort () , reindexar parece un poco tonto, pero si es necesario, esto lo hará. Aunque no en el lugar. Use array_walk () si va a hacer esto en un montón de lugares, solo use un bucle for-key-value si esta es una operación de una sola vez.
fuente
Si está bien hacer una nueva matriz, es esto:
Si necesita una inversión en el lugar, debe correr hacia atrás para no pisar los índices que necesita:
fuente
array_values()
para obtener una matriz basada en 0 y luego hacer algunos ajustes a ese resultado si realmente se requiere una matriz basada en 1 .