168 votes

Comment réindexer un tableau en PHP mais avec des index commençant à partir de 1 ?

J'ai le tableau suivant, que je voudrais réindexer pour que les clés soient inversées (idéalement en commençant à 1) :

Tableau actuel ( éditer : le tableau ressemble en fait à ceci) :

Array (

[2] => Object
    (
        [title] => Section
        [linked] => 1
    )

[1] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[0] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)

Comment ça devrait être :

Array (

[1] => Object
    (
        [title] => Section
        [linked] => 1
    )

[2] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[3] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)

1 votes

Où y a-t-il quelque chose d'inversé ?

0 votes

Voir ma modification du premier exemple

0 votes

Et pourquoi faut-il que l'indice du premier élément soit 1 ? Juste une question de format ou pour un traitement interne ?

469voto

Andrew Moore Points 49765

Si vous voulez réindexer à partir de zéro, il suffit de faire ce qui suit :

$iZero = array_values($arr);

Si vous voulez qu'il commence à un, utilisez ce qui suit :

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

Voici les pages de manuel pour les fonctions utilisées :

1 votes

Vous devriez utiliser range(0, count($arr) - 1) pour obtenir un tableau à indexation zéro.

0 votes

C'est génial, alternativement vous pouvez essayer d'utiliser array_unshift($arr,'') pour ajouter un élément à indexation nulle, puis unset($arr[0]) pour le supprimer, déplaçant ainsi tous les index vers le haut d'une unité. C'est peut-être plus rapide que array_combine(). Ou pas :)

0 votes

Notez que array_values renvoie une copie du tableau. Donc, si vous avez des références au tableau, alors array_splice serait mieux. Voir la solution de @imagiro.

58voto

la_chouette Points 488

Voici le meilleur moyen :

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

qui renvoie

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

en faisant cela

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

vous obtenez ceci

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

Explication

array_values() : Renvoie les valeurs du tableau d'entrée et des index de façon numérique.

array_filter() : Filtre les éléments d'un tableau avec une fonction définie par l'utilisateur (UDF). Si aucun n'est fourni , toutes les entrées de la table d'entrée valant FALSE seront supprimées .)

3 votes

Si vous ne vous souciez pas de l'ordre, vous pouvez également vous contenter de sort($array) ;

0 votes

array_filter() semble complètement hors de propos par rapport aux données de l'échantillon.

0 votes

Le PO veut que les touches commencent à partir de 1. C'est la réponse correcte à une question différente.

9voto

Gumbo Points 279147

Pourquoi réindexer ? Il suffit d'ajouter 1 à l'index :

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

Modifier    Après que la question ait été clarifiée : Vous pourriez utiliser le array_values pour réinitialiser l'index à partir de 0. Ensuite, vous pouvez utiliser l'algorithme ci-dessus si vous voulez juste que les éléments imprimés commencent à 1.

0 votes

Réponse sous-estimée à cette question :)

6voto

Peter Bailey Points 62125

Eh bien, j'aimerais penser que, quel que soit votre objectif final, vous n'auriez pas besoin de modifier le tableau pour qu'il soit basé sur 1 plutôt que sur 0, mais que vous pourriez plutôt le gérer au moment de l'itération comme Gumbo l'a indiqué.

Cependant Pour répondre à votre question, cette fonction devrait convertir n'importe quel tableau en une version basée sur 1.

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

EDIT

Voici une fonction plus réutilisable/flexible, si vous le souhaitez

$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 ) );
}

5voto

Greg Points 132247

Cela fera ce que vous voulez :

<?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 ) 

?>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X