2010-01-31 5 views
7

Comment puis-je supprimer un élément d'un tableau et le réorganiser par la suite, sans avoir un élément vide dans le tableau?PHP | Supprimer l'élément de la matrice avec réorganisation?

<?php 
    $c = array(0=>12,1=>32); 
    unset($c[0]); // will distort the array. 
?> 

Réponse/Solution: tableau array_values ​​(tableau d'entrée de $).

<?php 
    $c = array(0=>12,1=>32); 
    unset($c[0]); 
    print_r(array_values($c)); 
    // will print: the array cleared 
?> 

Répondre

11
array_values($c) 

retournera un nouveau tableau avec seulement les valeurs, indexées de façon linéaire.

4

Si vous supprimez toujours le premier élément, utilisez array_shift() au lieu de unset(). Sinon, vous devriez pouvoir utiliser quelque chose comme $ a = array_values ​​($ a).

1

Si vous supprimez uniquement le premier élément du tableau, vous pouvez utiliser array_shift($c);

-1

Ou reset(); est également un bon choix

+0

'reset();' est pas, selon PHP.net: « reset() rembobine array ' s pointeur interne au premier élément et renvoie la valeur du premier élément du tableau. " – Harmen

+0

Ok Merci, en effet pour votre downvote – streetparade

2

Une autre option serait array_splice(). Cela réordonne les clés numériques et semble être une méthode plus rapide si vous croyez suffisamment de données à prendre soin. Mais j'aime les valeurs array_values ​​() de unset() pour la lisibilité.

array_splice($array, $index, $num_elements_to_remove); 

http://php.net/manual/en/function.array-splice.php

Test de vitesse:

ArraySplice process used 7468 ms for its computations 
    ArraySplice spent 918 ms in system calls 
    UnsetReorder process used 9963 ms for its computations 
    UnsetReorder spent 31 ms in system calls 

Code d'essai:

function rutime($ru, $rus, $index) { 
    return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000)) 
    - ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000)); 
} 

function time_output($title, $rustart, $ru) { 
     echo $title . " process used " . rutime($ru, $rustart, "utime") . 
      " ms for its computations\n"; 
     echo $title . " spent " . rutime($ru, $rustart, "stime") . 
      " ms in system calls\n"; 
} 

$test = array(); 
for($i = 0; $i<100000; $i++){ 
     $test[$i] = $i; 
} 

$rustart = getrusage(); 
for ($i = 0; $i<1000; $i++){ 
     array_splice($test,90000,1); 
} 
$ru = getrusage(); 
time_output('ArraySplice', $rustart, $ru); 

unset($test); 
$test = array(); 
for($i = 0; $i<100000; $i++){ 
     $test[$i] = $i; 
} 

$rustart = getrusage(); 
for ($i = 0; $i<1000; $i++){ 
     unset($test[90000]); 
     $test = array_values($test); 
} 
$ru = getrusage(); 
time_output('UnsetReorder', $rustart, $ru); 
0

array_shift()décale la première valeur du tableau de et le renvoie, raccourcissant le tableau d'un élément et déplaçant tout vers le bas. Toutes les touches du tableau numérique seront modifiées pour commencer à compter à partir de zéro tandis que les touches littérales ne seront pas touchées.

array_shift ($ pile);

exemple:

$stack = array("orange", "banana", "apple", "raspberry"); 
$fruit = array_shift($stack); 
print_r($stack); 

sortie:

Array 
(
    [0] => banana 
    [1] => apple 
    [2] => raspberry 
) 

Source: http://php.net/manual/en/function.array-shift.php

+0

Wow, vous êtes grand sur copier et coller. S'il vous plaît lire http://stackoverflow.com/help/how-to-answer –

+0

Merci pour cela! –