it-swarm.com.de

Array-Schlüssel nach dem Deaktivieren von Elementen neu löschen

Ich habe ein Array:

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

Wenn ich den Inhalt des Arrays sichern 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 Tasten durchschleife und loslasse, wird der Index aufgebockt.

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

Wenn ich jetzt noch einen Dump machen würde, würde das dann so aussehen:

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

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

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

Versuche dies:

$array = array_values($array);

Verwenden Sie array_values ​​()

376
Neal

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.

14
Web_Developer

Verwenden array_splice statt 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.

12
Demian Brecht

Nur ein Zusatz.

Ich weiß, dass dies alt ist, aber ich wollte eine Lösung hinzufügen, die ich nicht gefunden habe mich selber. Fand diese Frage auf der Suche nach einer anderen Lösung und dachte nur: "Nun, während ich hier bin."

Zuallererst ist Neal s Antwort gut und großartig, nachdem Sie Ihre Schleife ausgeführt haben. Ich würde es jedoch vorziehen, alle Arbeiten auf einmal auszuführen. Natürlich musste ich in meinem speziellen Fall more arbeiten als dieses einfache Beispiel hier, aber die Methode gilt immer noch. Ich habe gesehen, wo ein paar andere foreach -Schleifen vorgeschlagen haben, aber dies lässt Sie aufgrund der Natur des Tieres immer noch mit after work zurück. Normalerweise schlage ich einfachere Dinge wie foreach vor. In diesem Fall ist es jedoch am besten, sich an die gute altmodische for loop - Logik zu erinnern. Verwenden Sie einfach i! Um den entsprechenden Index beizubehalten, subtrahieren Sie einfach nach jeder Entfernung eines Array-Elements von i.

Hier ist mein einfaches Beispiel funktioniert:

$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 ausgeben:

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

Dies kann viele einfache Implementierungen haben. Beispielsweise 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 ausgeben:

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.

5
SpYk3HH

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

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

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 ist Ihr $array ohne die Werte, die Sie in $unsets eingegeben haben, und die Schlüssel werden zurückgesetzt

1
upful

Ich benutze $arr = array_merge($arr);, um ein Array zu rebasieren. Einfach und unkompliziert.

0
Rockin4Life33