2010-01-04 6 views
6

Ich habe ein Array Werte aus einem Array zu entfernen, die numerische oder assoziative Schlüssel oder beides enthalten:Wie während Umnummerierung Zifferntasten

$x = array('a', 'b', 'c', 'foo' => 'bar', 'd', 'e'); 
print_r($x); 
/*(
    [0] => a 
    [1] => b 
    [2] => c 
    [foo] => bar 
    [3] => d 
    [4] => e 
)*/ 

Ich möchte in der Lage, ein Element aus dem Array zu entfernen, Umnummerierung die nicht-assoziativen Schlüssel, sie zu halten sequenziellen:

$x = remove($x, "c"); 
print_r($x); 
/* desired output: 
(
    [0] => a 
    [1] => b 
    [foo] => bar 
    [2] => d 
    [3] => e 
)*/ 

das richtige Element zu finden, ist zu entfernen, kein Problem, es der Schlüssel ist, dass das Problem ist. unset nicht die Schlüssel neu nummeriert, und array_splice arbeitet auf einem offset, anstelle eines Schlüssels (dh: nehmen $ x aus dem ersten Beispiel, array_splice($x, 3, 1) würde das "bar" -Element anstelle des "d" -Elements entfernen).

Antwort

13

Dies sollte das Array neu indiziert unter Beibehaltung String-Schlüssel:

$x = array_merge($x); 
0

Ich habe mit diesem kommen - obwohl ich nicht sicher bin, ob es das Beste ist:

// given: $arr is the array 
//  $item is the item to remove 

$key = array_search($item, $arr); // the key we need to remove 
$arrKeys = array_keys($arr); 
$keyPos = array_search($key, $arrKeys); // the offset of the item in the array 

unset($arr[$key]); 
array_splice($arrKeys, $keyPos, 1); 

for ($i = $keyPos; $i < count($arrKeys); ++$i) { 
    if (is_int($arrKeys[$i])) --$arrKeys[$i]; // shift numeric keys back one 
} 
$arr = array_combine($arrKeys, $arr); // recombine the keys and values. 

Es gibt ein paar Dinge, die ich ausgelassen, nur aus Gründen der Kürze. Beispielsweise würden Sie überprüfen, ob das Array assoziativ ist, und ob der Schlüssel, den Sie entfernen, eine Zeichenfolge ist oder nicht, bevor Sie den obigen Code verwenden.

0

Try array_diff() ist es nicht das neue Array korrekt obwohl bestellen können, wenn nicht die folgenden sollte

Sie arbeiten müssen über sie in der Funktion remove iterieren.

function remove($x,$r){ 
$c = 0; 
$a = array(); 
foreach ($x as $k=>$v){ 
    if ($v != $r) { 
    if (is_int($k)) { 
     $a[$c] = $v; 
     $c++; 
    } 
    else { 
     $a[$k] = $v; 
    } 
    } 
} 
return $a; 
} 

DC

0

Ich glaube nicht, dass es eine elegante Lösung für dieses Problem ist, müssen Sie wahrscheinlich auf die Array-Schleife und neu ordnen den Schlüssel selbst.

2

Sie mit dem nächsten elegantere Lösung Fixet kann:

Zum Beispiel:

 
<?php 

$array = array (
    1 => 'A', 
    2 => 'B', 
    3 => 'C' 
); 

unset($array[2]); 

/* $array is now: 
Array (
    1 => 'A', 
    3 => 'C' 
); 
As you can see, the index '2' is missing from the array. 
*/ 

// SOLUTION: 
$array = array_values($array); 

/* $array is now: 
Array (
    0 => 'A', 
    1 => 'C' 
); 
As you can see, the index begins from zero. 
*/ 
?> 
+0

Dies entfernt alle nicht -numerische Schlüssel. Bitte lesen Sie die ursprüngliche Frage erneut. – nickf

Verwandte Themen