Starten Sie die Array-Schlüssel neu, nachdem Sie die Elemente deaktiviert haben

182

Ich habe ein Array:

$array = array(1,2,3,4,5);

Wenn ich den Inhalt des Arrays ausgeben würde, würden sie folgendermaßen aussehen:

array(5) {
  [0] => int(1)
  [1] => int(2)
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}

Wenn ich bestimmte Schlüssel durchschleife und deaktiviere, wird der Index vollständig aufgebockt.

foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    unset($array[$i]);
  }
}

Wenn ich jetzt einen weiteren Dump machen würde, würde es so aussehen:

array(3) {
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}

Gibt es eine geeignete Möglichkeit, das Array zurückzusetzen, damit seine Elemente wieder auf Null basieren?

array(3) {
  [0] => int(3)
  [1] => int(4)
  [2] => int(5)
}
TuK
quelle

Antworten:

410

Versuche dies:

$array = array_values($array);

Verwenden von array_values ​​()

Naftali alias Neal
quelle
6
+1. Ich stelle fest, dass im Handbuch nicht ausdrücklich angegeben ist, dass die Bestellung beibehalten wird, aber ich kann nicht verstehen, warum dies nicht der Fall ist.
Leichtigkeitsrennen im Orbit
16
Ja, die Bestellung wird definitiv beibehalten. Wäre eine schreckliche Funktion, wenn es neu geordnet würde! :)
webbiedave
1
@webbiedave sorry, aber das ist nicht wahr. Mein Array wird tatsächlich neu angeordnet. Sehr sehr seltsam.
FooBar
4
Gehen Sie immer für die einfachen prägnanten Lösungen :)
Bruce Lim
1
Dies ist zwar eine einfache Lösung, wenn das Array bereits nummeriert ist, funktioniert jedoch nicht, wenn der Schlüssel als Text festgelegt ist, wie dies bei einem HTML-Formular der Fall wäre. Wenn Sie sich auf eindeutige Schlüsselwerte verlassen, um die Ausgabe eines Formulars zu identifizieren, funktioniert eine der folgenden Methoden besser.
17

Ich habe eine andere interessante Methode:

$array = array('a', 'b', 'c', 'd'); 
unset($array[2]); 

$array = array_merge($array); 

Jetzt werden die $ -Array-Schlüssel zurückgesetzt.

Web-Entwickler
quelle
13

Verwenden Sie array_spliceeher als unset:

$array = array(1,2,3,4,5);
foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    array_splice($array, $i, 1);
  }
}

print_r($array);

Arbeitsprobe hier .

Demian Brecht
quelle
7
Das funktioniert nicht. Spleiß wäre fantastisch, aber Sie können ihn nicht in einer for / foreach-Schleife verwenden, da er den Index jedes Mal neu anordnet, wenn Sie ihn aufrufen. Der Index der foreach-Schleife zeigt also nicht auf das nächste Element, sondern auf das Element mit dieser Position auf dem neu angeordneten Array. Sie können in Ihrem Beispiel sehen, dass Sie den Wert '3' löschen und den Wert '2'
belassen
1
@elcodedocle Dann benutze keine foreachSchleife. Verwenden Sie den Standard i Loopund setzen Sie i nach einem Spleiß einfach zurück. Funktioniert auch Working sample here.nicht.
SpYk3HH
Defekter Link, können Sie das Problem beheben?
Michel Ayres
5

Nur ein Zusatz.

Ich weiß, dass dies alt ist , aber ich wollte eine Lösung hinzufügen, von der ich nicht sehe, dass ich sie mir ausgedacht habe. Ich habe diese Frage auf der Suche nach einer anderen Lösung gefunden und mir nur gedacht: "Nun, während ich hier bin."

Zuallererst ist Neals Antwort gut und großartig, nachdem Sie Ihre Schleife ausgeführt haben. Ich würde es jedoch vorziehen, alle Arbeiten auf einmal zu erledigen. Natürlich musste ich in meinem speziellen Fall mehr arbeiten als in diesem einfachen Beispiel, aber die Methode gilt immer noch. Ich habe gesehen, wo ein paar andere foreachLoops vorgeschlagen haben , aber das lässt dich nach der Arbeit aufgrund der Natur des Tieres immer noch zurück. Normalerweise schlage ich einfachere Dinge vor foreach, aber in diesem Fall ist es am besten, sich an gute altmodische for loopLogik zu erinnern . Einfach benutzen i! Um den entsprechenden Index beizubehalten, subtrahieren Sie einfach inach jedem Entfernen eines Array-Elements.

Hier ist mein einfaches Arbeitsbeispiel :

$array = array(1,2,3,4,5);

for ($i = 0; $i < count($array); $i++) {
    if($array[$i] == 1 || $array[$i] == 2) {
        array_splice($array, $i, 1);
        $i--;
    }
}

Wird ausgegeben:

array(3) {
    [0]=> int(3)
    [1]=> int(4)
    [2]=> int(5)
}

Dies kann viele einfache Implementierungen haben. Zum Beispiel erforderte mein genauer Fall das Halten des neuesten Elements im Array basierend auf mehrdimensionalen Werten. Ich zeige dir was ich meine:

$files = array(
    array(
        'name' => 'example.zip',
        'size' => '100000000',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '10726556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '110726556',
        'type' => 'application/x-zip-compressed',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example2.zip',
        'size' => '12356556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example2.zip',
        'deleteUrl' => 'server/php/?file=example2.zip',
        'deleteType' => 'DELETE'
    )
);

for ($i = 0; $i < count($files); $i++) {
    if ($i > 0) {
        if (is_array($files[$i-1])) {
            if (!key_exists('name', array_diff($files[$i], $files[$i-1]))) {
                if (!key_exists('url', $files[$i]) && key_exists('url', $files[$i-1])) $files[$i]['url'] = $files[$i-1]['url'];
                $i--;
                array_splice($files, $i, 1);
            }
        }
    }
}

Wird ausgegeben:

array(1) {
    [0]=> array(6) {
            ["name"]=> string(11) "example.zip"
            ["size"]=> string(9) "110726556"
            ["type"]=> string(28) "application/x-zip-compressed"
            ["deleteUrl"]=> string(28) "server/php/?file=example.zip"
            ["deleteType"]=> string(6) "DELETE"
            ["url"]=> string(44) "28188b90db990f5c5f75eb960a643b96/example.zip"
        }
    [1]=> array(6) {
            ["name"]=> string(11) "example2.zip"
            ["size"]=> string(9) "12356556"
            ["type"]=> string(28) "application/x-zip-compressed"
            ["deleteUrl"]=> string(28) "server/php/?file=example2.zip"
            ["deleteType"]=> string(6) "DELETE"
            ["url"]=> string(45) "28188b90db990f5c5f75eb960a643b96/example2.zip"
        }
}

Wie Sie sehen, manipuliere ich $ i vor dem Spleiß, während ich versuche, das vorherige und nicht das aktuelle Element zu entfernen.

SpYk3HH
quelle
1

Späte Antwort aber nach PHP 5.3 könnte es so sein;

$array = array(1, 2, 3, 4, 5);
$array = array_values(array_filter($array, function($v) {
    return !($v == 1 || $v == 2);
}));
print_r($array);
K-Gun
quelle
1

Oder Sie können eine eigene Funktion erstellen, die das Array als Referenz übergibt.

function array_unset($unsets, &$array) {
  foreach ($array as $key => $value) {
    foreach ($unsets as $unset) {
      if ($value == $unset) {
        unset($array[$key]);
        break;
      }
    }
  }
  $array = array_values($array);
}

Dann müssen Sie nur noch ...

$unsets = array(1,2);
array_unset($unsets, $array);

... und jetzt sind Sie $arrayohne die Werte, die Sie eingegeben haben, $unsetsund die Tasten werden zurückgesetzt

upful
quelle
1

100% arbeiten für mich! Nach nicht gesetzten Elementen im Array können Sie dies zum erneuten Indizieren des Arrays verwenden

$result=array_combine(range(1, count($your_array)), array_values($your_array));
Atta Ur Rehman
quelle
0

Ich benutze $arr = array_merge($arr); , um ein Array neu zu gründen. Einfach und unkompliziert.

Rockin4Life33
quelle
-2

In meiner Situation musste ich eindeutige Schlüssel mit den Array-Werten beibehalten, daher habe ich nur ein zweites Array verwendet:

$arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot");
unset($arr1);

$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);
John K.
quelle
1) Sie, unset($arr1)die es NICHT verfügbar machen, um in Ihrer Schleife zu iterieren. 2) Ihnen fehlt das Semikolon in der vorletzten Zeile. Dieses Code-Snippet wird nicht ausgeführt.
Rockin4Life33