vacio una recorrer obtener multidimensional matriz matrices indice hacer elementos ejemplos como array agregar 3x3 php arrays indexing

una - php array key value



¿Cómo reindexas una matriz en PHP? (17)

Tengo la siguiente matriz, que me gustaría reindexar para que las claves se inviertan (idealmente comenzando en 1):

Arreglo actual ( editar: la matriz realmente 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] => ) )


¿Por qué reindexar? Solo agregue 1 al índice:

foreach ($array as $key => $val) { echo $key + 1, ''<br>''; }

Editar Después de aclarar la pregunta: puede usar los array_values la 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.


Acabo de descubrir que también puedes hacer un

array_splice($ar, 0, 0);

Eso hace que la reindexación en el lugar, por lo que no termina con una copia de la matriz original.


Al igual que @monowerker, necesitaba reindexar una matriz usando la clave de un objeto ...

$new = array(); $old = array( (object)array(''id'' => 123), (object)array(''id'' => 456), (object)array(''id'' => 789), ); print_r($old); array_walk($old, function($item, $key, &$reindexed_array) { $reindexed_array[$item->id] = $item; }, &$new); print_r($new);

Esto resultó en:

Array ( [0] => stdClass Object ( [id] => 123 ) [1] => stdClass Object ( [id] => 456 ) [2] => stdClass Object ( [id] => 789 ) ) Array ( [123] => stdClass Object ( [id] => 123 ) [456] => stdClass Object ( [id] => 456 ) [789] => stdClass Object ( [id] => 789 ) )


Al igual que 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 al paso de variables por referencia. Ejemplo de reindexación de la función es así usando el use palabras clave de cierre:

function indexArrayByElement($array, $element) { $arrayReindexed = []; array_walk( $array, function ($item, $key) use (&$arrayReindexed, $element) { $arrayReindexed[$item[$element]] = $item; } ); return $arrayReindexed; }


Aquí está mi propia implementación. Las claves de la matriz de entrada se renumerarán con las teclas de incremento a partir de $ start_index.

function array_reindex($array, $start_index) { $array = array_values($array); $zeros_array = array_fill(0, $start_index, null); return array_slice(array_merge($zeros_array, $array), $start_index, null, true); }


Bueno, me gustaría pensar que, sea cual sea tu objetivo final, no necesitarías modificar el arreglo para que esté basado en 1 en lugar de basado en 0, sino que podría manejarlo en el momento de la iteración como Gumbo publicado.

Sin embargo , para responder a su pregunta, esta función debe convertir cualquier matriz en una versión basada en 1

function convertToOneBased( $arr ) { return array_combine( range( 1, count( $arr ) ), array_values( $arr ) ); }

EDITAR

Aquí hay una función más reutilizable / flexible, si lo desea

$arr = array( ''a'', ''b'', ''c'' ); echo ''<pre>''; print_r( reIndexArray( $arr ) ); print_r( reIndexArray( $arr, 1 ) ); print_r( reIndexArray( $arr, 2 ) ); print_r( reIndexArray( $arr, 10 ) ); print_r( reIndexArray( $arr, -10 ) ); echo ''</pre>''; function reIndexArray( $arr, $startAt=0 ) { return ( 0 == $startAt ) ? array_values( $arr ) : array_combine( range( $startAt, count( $arr ) + ( $startAt - 1 ) ), array_values( $arr ) ); }


Es posible que desee considerar por qué desea utilizar una matriz basada en 1 en absoluto. Las matrices basadas en cero (cuando se utilizan matrices no asociativas) son bastante estándar, y si quiere enviarlas a una interfaz de usuario, la mayoría manejaría la solución simplemente aumentando el número entero a la salida de la interfaz de usuario.

Piense en la coherencia, tanto en su aplicación como en el código con el que trabaja, cuando piensa en indexadores basados ​​en 1 para matrices.


Esto hará lo que quieras:

<?php $array = array(2 => ''a'', 1 => ''b'', 0 => ''c''); array_unshift($array, false); // Add to the start of the array $array = array_values($array); // Re-number // Remove the first index so we start at 1 $array = array_slice($array, 1, count($array), true); print_r($array); // Array ( [1] => a [2] => b [3] => c ) ?>


La sort() 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 ciclo for-key-value si se trata de una operación de una sola vez.

<?php function reindex(&$item, $key, &$reindexedarr) { $reindexedarr[$key+1] = $item; } $arr = Array (2 => ''c'', 1 => ''b'', 0 => ''a''); sort($arr); $newarr = Array(); array_walk($arr, reindex, &$newarr); $arr = $newarr; print_r($arr); // Array ( [1] => a [2] => b [3] => c ) ?>


Puede reindexar una matriz para que la nueva matriz comience con un índice de 1 como este;

$arr = array( ''2'' => ''red'', ''1'' => ''green'', ''0'' => ''blue'', ); $arr1 = array_values($arr); // Reindex the array starting from 0. array_unshift($arr1, ''''); // Prepend a dummy element to the start of the array. unset($arr1[0]); // Kill the dummy element. print_r($arr); print_r($arr1);

El resultado de lo anterior es;

Array ( [2] => red [1] => green [0] => blue ) Array ( [1] => red [2] => green [3] => blue )


Si desea volver a indexar comenzando a cero, simplemente haga lo siguiente:

$iZero = array_values($arr);

Si necesita que comience en uno, entonces use lo siguiente:

$iOne = array_combine(range(1, count($arr)), array_values($arr));

Estas son las páginas de manual para las funciones utilizadas:


Si está bien hacer una nueva matriz es esta:

$result = array(); foreach ( $array as $key => $val ) $result[ $key+1 ] = $val;

Si necesita revertir en el lugar, necesita correr hacia atrás para no pisar los índices que necesita:

for ( $k = count($array) ; $k-- > 0 ; ) $result[ $k+1 ] = $result[ $k ]; unset( $array[0] ); // remove the "zero" element


Si no está tratando de reordenar la matriz, puede hacer lo siguiente:

$ 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. Así que no me puedo atribuir el mérito de haberlo ideado. Pero es muy simple y rápido.


Una solución más elegante:

$list = array_combine(range(1, count($list)), array_values($list));


duplicar la eliminación y reindexar una matriz:

<?php $oldArray = array(''0''=>''php'',''1''=>''java'',''2''=>'''',''3''=>''asp'',''4''=>'''',''5''=>''mysql''); //duplicate removal $fillteredArray = array_filter($oldArray); //reindexing actually happens here $newArray = array_merge($filteredArray); print_r($newArray); ?>


Aquí está la mejor manera :

# Array $array = array(''tomato'', '''', ''apple'', ''melon'', ''cherry'', '''', '''', ''banana'');

eso regresa

Array ( [0] => tomato [1] => [2] => apple [3] => melon [4] => cherry [5] => [6] => [7] => banana )

al hacer esto

$array = array_values(array_filter($array));

obtienes esto

Array ( [0] => tomato [1] => apple [2] => melon [3] => cherry [4] => banana )

Explicación

array_values() : devuelve los valores de la matriz de entrada y los índices numéricamente.

array_filter() : filtra los elementos de una matriz con una función definida por el usuario (UDF. Si no se proporciona ninguna , se borrarán todas las entradas en la tabla de entrada con el valor FALSO ).


$tmp = array(); foreach (array_values($array) as $key => $value) { $tmp[$key+1] = $value; } $array = $tmp;