Frage

Gibt es eine einfache Möglichkeit, mit PHP ein Element aus einem Array zu löschen? foreach ($array) Enthält dieses Element nicht mehr?

Ich dachte, das wäre die Einstellung null Ich würde es tun, aber anscheinend funktioniert es nicht.

War es hilfreich?

Lösung

Es gibt verschiedene Möglichkeiten, ein Array-Element zu löschen, in denen einige mehr nützlich für einige spezifische Aufgaben sind als andere.

Löschen eines Array-Element

Wenn Sie nur ein Array-Element löschen, die Sie verwenden können, \unset() oder alternativ \array_splice() .

Auch wenn Sie den Wert haben und nicht wissen, die Taste, um das Element löschen Sie \array_search() um den Schlüssel zu erhalten.

\unset() Methode

Beachten Sie, dass, wenn Sie \unset() die Array-Schlüssel verwenden, nicht / reindex ändern. Wenn Sie die Schlüssel indizieren möchten, können Sie verwenden, \array_values() nach \unset() denen konvertiert alle Schlüssel zu numerischen ab 0 Aufzählungs Tasten.

Code

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    \unset($array[1]);
                //↑ Key which you want to delete

?>

Output

[
    [0] => a
    [2] => c
]

\array_splice() Methode

Wenn Sie \array_splice() die Schlüssel automatisch indexiert werden, aber die assoziative Schlüssel nicht im Gegensatz zu \array_values() ändern, welche alle Schlüssel zu numerischen Tasten konvertieren.

Auch \array_splice() muss der Offset, nicht der Schlüssel! als zweiten Parameter.

Code

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    \array_splice($array, 1, 1);
                        //↑ Offset which you want to delete

?>

Output

[
    [0] => a
    [1] => c
]

array_splice() gleiche wie die Anordnung von Referenz \unset() zu nehmen, und dies bedeutet, dass Sie nicht wollen, die Rückgabewerte der Funktionen zurück auf das Array zuweisen.

Löschen mehrerer Array-Elemente

Wenn Sie mehrere Array-Elemente löschen möchten, und wollen nicht \unset() anrufen oder mehrmals \array_splice() Sie die Funktionen \array_diff() oder \array_diff_key() verwenden können, je nachdem, ob Sie die Werte kennen oder die Schlüssel der Elemente, die Sie löschen möchten.

\array_diff() Methode

Wenn Sie die Werte der Array-Elemente kennen, die Sie löschen möchten, dann können Sie \array_diff() verwenden. Wie zuvor bei \unset() wird es nicht ändern / reindex die Schlüssel des Arrays.

Code

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    $array = \array_diff($array, ["a", "c"]);
                               //└────────┘→ Array values which you want to delete

?>

Output

[
    [1] => b
]

\array_diff_key() Methode

Wenn Sie die Tasten der Elemente kennen, die Sie löschen möchten, dann möchten Sie \array_diff_key() verwenden. Hier müssen Sie sicherstellen, dass Sie die Schlüssel als Schlüssel im zweiten Parameter übergeben und nicht als Wert. Andernfalls müssen Sie das Array-Flip mit \array_flip() . Und auch hier werden die Schlüssel nicht / reindex ändern.

Code

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    $array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
                                    //↑           ↑ Array keys which you want to delete
?>

Output

[
    [1] => b
]

Auch wenn Sie \unset() oder \array_splice() löschen mehrere Elemente mit dem gleichen Wert verwenden möchten, können Sie \array_keys() erhalten alle Schlüssel für einen bestimmten Wert und dann alle Elemente gelöscht werden.

Andere Tipps

Es ist zu beachten, dass unset() werden Indizes unberührt bleiben, was ist das, was man erwarten würde, wenn String-Indizes verwenden (Array als Hash-Tabelle), kann aber ziemlich überraschend sein, wenn mit ganzzahligen indizierte Arrays zu tun:

$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [3]=>
  int(3)
} */

$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

So array_splice() kann verwendet werden, wenn Sie möchten, dass Ihre ganze Zahl Schlüssel normalisieren. Eine weitere Option ist mit array_values() nach

  // Our initial array
  $arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");
  print_r($arr);

  // Remove the elements who's values are yellow or red
  $arr = array_diff($arr, array("yellow", "red"));
  print_r($arr);

Dies ist die Ausgabe des obigen Codes:

Array
(
    [0] => blue
    [1] => green
    [2] => red
    [3] => yellow
    [4] => green
    [5] => orange
    [6] => yellow
    [7] => indigo
    [8] => red
)

Array
(
    [0] => blue
    [1] => green
    [4] => green
    [5] => orange
    [7] => indigo
)

Nun indiziert array_values() ein numerisches Array problemlos neu, entfernt jedoch alle Schlüsselzeichenfolgen aus dem Array und ersetzt sie durch Zahlen.Wenn Sie die Schlüsselnamen (Strings) beibehalten oder das Array neu indizieren müssen, wenn alle Schlüssel numerisch sind, verwenden Sie array_merge():

$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);

Ausgänge

Array
(
    [0] => blue
    [1] => green
    [2] => green
    [3] => orange
    [4] => indigo
)
$key = array_search($needle, $array);
if ($key !== false) {
    unset($array[$key]);
}
unset($array[$index]);

Wenn Sie ein numerisch indiziertes Array haben, wo alle Werte eindeutig sind (oder sie sind nicht einzigartig, aber sie wollen alle Instanzen eines bestimmten Wert entfernen), können Sie einfach array_diff () ein passendes Element zu entfernen, wie dies :

$my_array = array_diff($my_array, array('Value_to_remove'));

Zum Beispiel:

$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);

Dies zeigt die folgende:

4
3

In diesem Beispiel wird das Element mit dem Wert ‚Charles‘ entfernt wird, wie durch die sizeof prüft werden () aufruft, die eine Größe von 4 für die Ausgangsanordnung berichtet, und 3 nach der Entfernung.

Auch für ein benanntes Element:

unset($array["elementName"]);

Zerstört ein einzelnes Element eines Arrays

unset()

$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);

Der Ausgang wird sein:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>
  string(1) "D"
  [4]=>
  string(1) "E"
}

Wenn Sie Index das Array neu:

$array1 = array_values($array1);
var_dump($array1);

Dann wird der Ausgang sein:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "D"
  [3]=>
  string(1) "E"
}

Pop das letzte Element das Ende eines Arrays - den Wert des entfernten Elements zurückkehren

mixed array_pop(array &$array)

$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array

Der Ausgang wird

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
Last Fruit: raspberry

Entfernen des ersten Elements (rot) aus einem Array , - den Wert des entfernten Elements zurück

mixed array_shift ( array &$array )

$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);

Der Ausgang wird sein:

Array
(
    [b] => green
    [c] => blue
)
First Color: red
<?php
    $stack = array("fruit1", "fruit2", "fruit3", "fruit4");
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

Ausgabe:

Array
(
    [0] => fruit2
    [1] => fruit3
    [2] => fruit4
)

fruit1

Um zu vermeiden, die Suche eines mit array_diff rumspielen kann:

$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11

In diesem Fall muss man nicht suchen hat / den Schlüssel verwenden.

Wenn Sie mehrere Werte in einem Array löschen und die Einträge in diesem Array sind Objekte oder strukturierte Daten, [array_filter][1] ist die beste Wahl. Diese Einträge, die eine echte aus der Callback-Funktion zurückkehren wird beibehalten.

$array = [
    ['x'=>1,'y'=>2,'z'=>3], 
    ['x'=>2,'y'=>4,'z'=>6], 
    ['x'=>3,'y'=>6,'z'=>9]
];

$results = array_filter($array, function($value) {
    return $value['x'] > 2; 
}); //=> [['x'=>3,'y'=>6,z=>'9']]

unset() zerstört die angegebenen Variablen.

Das Verhalten von unset() innerhalb einer Funktion kann variieren, je nachdem, welche Art von Variablen, die Sie zu zerstören versuchen.

Wenn eine globalisierte Variable innerhalb einer Funktion unset() ist, wird nur die lokale Variable zerstört wird. Die Variable in der anrufenden Umgebung den gleichen Wert behält nach wie vor unset() genannt wurde.

<?php
    function destroy_foo()
    {
        global $foo;
        unset($foo);
    }

    $foo = 'bar';
    destroy_foo();
    echo $foo;
?>

Die Antwort des obigen Codes wird bar .

Um eine globale Variable innerhalb einer Funktion unset():

<?php
    function foo()
    {
        unset($GLOBALS['bar']);
    }

    $bar = "something";
    foo();
?>

Assoziative Arrays

Für assoziative Arrays verwenden unset :

$arr = array('a' => 1, 'b' => 2, 'c' => 3);
unset($arr['b']);

// RESULT: array('a' => 1, 'c' => 3)

Numerische Arrays

Bei numerischen Arrays verwenden array_splice :

$arr = array(1, 2, 3);
array_splice($arr, 1, 1);

// RESULT: array(0 => 1, 1 => 3)

Hinweis

Mit unset für numerische Arrays werden nicht zu einem Fehler, aber es wird vermasseln Ihre Indizes:

$arr = array(1, 2, 3);
unset($arr[1]);

// RESULT: array(0 => 1, 2 => 3)

Wenn Sie mehrere Elemente aus einem assoziativen Array entfernen müssen, können Sie eine href verwenden <= „http://php.net/manual/en/function.array-diff-key.php“ rel = „noreferrer“ > array_diff_key () (hier verwendet mit array_flip () ):

$my_array = array(
  "key1" => "value 1",
  "key2" => "value 2",
  "key3" => "value 3",
  "key4" => "value 4",
  "key5" => "value 5",
);

$to_remove = array("key2", "key4");

$result = array_diff_key($my_array, array_flip($to_remove));

print_r($result);

Ausgabe:

Array ( [key1] => value 1 [key3] => value 3 [key5] => value 5 ) 
// Remove by value
function removeFromArr($arr, $val)
{
    unset($arr[array_search($val, $arr)]);
    return array_values($arr);
}

Angenommen, Sie das folgende Array haben:

Array
(
    [user_id] => 193
    [storage] => 5
)

So löschen Sie storage, tun:

unset($attributes['storage']);
$attributes = array_filter($attributes);

Und Sie erhalten:

Array
(
    [user_id] => 193
)

Ich würde nur sagen, wie ich ein bestimmtes Objekt hatte die variable Attribute hatte (es war im Grunde eine Tabelle abbildet, und ich war die Spalten in der Tabelle zu ändern, so dass die Attribute in dem Objekt, variieren würden die Tabelle widerspiegelt als auch ):

class obj {
    protected $fields = array('field1','field2');
    protected $field1 = array();
    protected $field2 = array();
    protected loadfields(){}
    // This will load the $field1 and $field2 with rows of data for the column they describe
    protected function clearFields($num){
        foreach($fields as $field) {
            unset($this->$field[$num]);
            // This did not work the line below worked
            unset($this->{$field}[$num]); // You have to resolve $field first using {}
        }
    }
}

Der ganze Zweck des $fields war einfach, so habe mich nicht überall im Code aussehen, wenn sie geändert sind, die ich am Anfang der Klasse anschauen und die Liste der Attribute ändern und den $ Felder Array Inhalt die neuen Attribute zu reflektieren.

Sie die Standardfunktionen wie folgt vor:

i)

$Array = array("test1", "test2", "test3", "test3");

unset($Array[2]);

ii)

$Array = array("test1", "test2", "test3", "test3");

array_pop($Array);

iii)

$Array = array("test1", "test2", "test3", "test3");

array_splice($Array,1,2);

iv)

$Array = array("test1", "test2", "test3", "test3");

array_shift($Array);

Lösungen:

  1. Um ein Element zu löschen, verwenden Sie unset():
unset($array[3]);
unset($array['foo']);
  1. Um mehrere nicht zusammenhängende Elemente zu löschen, verwenden Sie auch unset():
unset($array[3], $array[5]);
unset($array['foo'], $array['bar']);
  1. Um mehrere zusammenhängende Elemente zu löschen, verwenden Sie array_splice():
array_splice($array, $offset, $length);

Weitere Erläuterung:

Durch die Verwendung dieser Funktionen werden alle Verweise auf diese Elemente aus PHP entfernt.Wenn Sie einen Schlüssel im Array behalten möchten, aber einen leeren Wert haben möchten, weisen Sie dem Element die leere Zeichenfolge zu:

$array[3] = $array['foo'] = '';

Neben der Syntax gibt es einen logischen Unterschied zwischen der Verwendung unset() und dem Element „“ zuweisen.Der erste sagt This doesn't exist anymore, während der zweite sagt This still exists, but its value is the empty string.

Wenn Sie mit Zahlen arbeiten, ist die Zuweisung von 0 möglicherweise die bessere Alternative.Wenn ein Unternehmen also die Produktion des Kettenradmodells XL1000 einstellen würde, würde es seinen Lagerbestand aktualisieren mit:

unset($products['XL1000']);

Wenn jedoch vorübergehend keine XL1000-Kettenräder mehr vorhanden sind, Sie aber später in dieser Woche eine neue Lieferung aus dem Werk erhalten möchten, ist dies besser:

$products['XL1000'] = 0;

Wenn du unset() Wenn Sie ein Element hinzufügen, passt PHP das Array so an, dass die Schleife weiterhin korrekt funktioniert.Das Array wird nicht komprimiert, um die fehlenden Lücken zu füllen.Das meinen wir, wenn wir sagen, dass alle Arrays assoziativ sind, auch wenn sie numerisch erscheinen.Hier ist ein Beispiel:

// Create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
print $animals[1];  // Prints 'bee'
print $animals[2];  // Prints 'cat'
count($animals);    // Returns 6

// unset()
unset($animals[1]); // Removes element $animals[1] = 'bee'
print $animals[1];  // Prints '' and throws an E_NOTICE error
print $animals[2];  // Still prints 'cat'
count($animals);    // Returns 5, even though $array[5] is 'fox'

// Add a new element
$animals[ ] = 'gnu'; // Add a new element (not Unix)
print $animals[1];  // Prints '', still empty
print $animals[6];  // Prints 'gnu', this is where 'gnu' ended up
count($animals);    // Returns 6

// Assign ''
$animals[2] = '';   // Zero out value
print $animals[2];  // Prints ''
count($animals);    // Returns 6, count does not decrease

Um das Array in ein dicht gefülltes numerisches Array zu komprimieren, verwenden Sie array_values():

$animals = array_values($animals);

Alternative, array_splice() Indiziert Arrays automatisch neu, um Lücken zu vermeiden:

// Create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
array_splice($animals, 2, 2);
print_r($animals);
Array
(
    [0] => ant
    [1] => bee
    [2] => elk
    [3] => fox
)

Dies ist nützlich, wenn Sie das Array als Warteschlange verwenden und Elemente aus der Warteschlange entfernen und gleichzeitig den Direktzugriff zulassen möchten.Um das erste oder letzte Element sicher aus einem Array zu entfernen, verwenden Sie array_shift() Und array_pop(), jeweils.

ungesetzt () mehr fragmentierte Elemente aus einem Array

Während unset() wurde hier mehrfach erwähnt, hat es noch erwähnt werden, dass unset() mehrere Variablen machen akzeptiert es einfach, mehrere nicht aufeinander folgende Elemente aus einem Array in einem Arbeitsgang zu löschen:

// Delete multiple, noncontiguous elements from an array
$array = [ 'foo', 'bar', 'baz', 'quz' ];
unset( $array[2], $array[3] );
print_r($array);
// Output: [ 'foo', 'bar' ]

unset () dynamisch

unset () keine Anordnung von Tasten akzeptieren zu entfernen, so dass der Code unten fail (es einfacher ungesetzt verwenden leicht gemacht hätte () dynamisch obwohl).

$array = range(0,5);
$remove = [1,2];
$array = unset( $remove ); // FAILS: "unexpected 'unset'"
print_r($array);

Stattdessen ungesetzt () kann dynamisch in einem foreach Schleife verwendet werden:

$array = range(0,5);
$remove = [1,2];
foreach ($remove as $k=>$v) {
    unset($array[$v]);
}
print_r($array);
// Output: [ 0, 3, 4, 5 ]

Entfernen Array-Schlüssel durch das Array Kopieren

Es gibt auch eine andere Praxis, die noch erwähnt werden muss. Manchmal, auf die einfachste Art und Weise bestimmten Array-Schlüssel loszuwerden ist einfach $ array1 in $ array2 kopieren.

$array1 = range(1,10);
foreach ($array1 as $v) {
    // Remove all even integers from the array
    if( $v % 2 ) {
        $array2[] = $v;
    }
}
print_r($array2);
// Output: [ 1, 3, 5, 7, 9 ];

Offensichtlich ist die gleiche Praxis gilt für Textzeichenfolgen:

$array1 = [ 'foo', '_bar', 'baz' ];
foreach ($array1 as $v) {
    // Remove all strings beginning with underscore
    if( strpos($v,'_')===false ) {
        $array2[] = $v;
    }
}
print_r($array2);
// Output: [ 'foo', 'baz' ]
<?php
    // If you want to remove a particular array element use this method
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");

    print_r($my_array);
    if (array_key_exists("key1", $my_array)) {
        unset($my_array['key1']);
        print_r($my_array);
    }
    else {
        echo "Key does not exist";
    }
?>

<?php
    //To remove first array element
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
    print_r($my_array);
    $new_array = array_slice($my_array, 1);
    print_r($new_array);
?>


<?php
    echo "<br/>    ";
    // To remove first array element to length
    // starts from first and remove two element
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
    print_r($my_array);
    $new_array = array_slice($my_array, 1, 2);
    print_r($new_array);
?>
   

Output

 Array ( [key1] => value 1 [key2] => value 2 [key3] =>
 value 3 ) Array (    [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
 Array ( [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
 Array ( [key2] => value 2 [key3] => value 3 )

Entfernen Element ein Array basiert auf einem Schlüssel:

Mit der unset Funktion wie folgt:

$a = array(
       'salam',
       '10',
       1
);

unset($a[1]);

print_r($a);

/*

    Output:

        Array
        (
            [0] => salam
            [2] => 1
        )

*/

Entfernen Element eines Array basierend auf dem Wert:

Mit der array_search Funktion ein Element drücken und mit der oben beschriebenen Weise erhalten ein Array-Element zu entfernen, wie unten:

$a = array(
       'salam',
       '10',
       1
);

$key = array_search(10, $a);

if ($key !== false) {
    unset($a[$key]);
}

print_r($a);

/*

    Output:

        Array
        (
            [0] => salam
            [2] => 1
        )

*/
<?php
    $array = array("your array");
    $array = array_diff($array, ["element you want to delete"]);
?>

Erstellen Sie Ihr Array in der Variablen $array und dann, wo ich setzen ‚Element, das Sie löschen möchten‘ Sie setzen so etwas wie: „a“. Und wenn Sie dann mehrere Elemente löschen. „A“, „b“

Verwenden Sie den folgenden Code ein:

$arr = array('orange', 'banana', 'apple', 'raspberry');
$result = array_pop($arr);
print_r($result);

Zwei Möglichkeiten zum Entfernen des ersten Element eines Arrays mit Ordnung des Index zu halten und auch wenn Sie nicht wissen, den Schlüsselnamen des ersten Elements.

Lösung 1

// 1 is the index of the first object to get
// NULL to get everything until the end
// true to preserve keys
$array = array_slice($array, 1, null, true);

Lösung 2

// Rewinds the array's internal pointer to the first element
// and returns the value of the first array element.
$value = reset($array);
// Returns the index element of the current array position
$key = key($array);
unset($array[$key]);

Für diese Beispieldaten:

$array = array(10 => "a", 20 => "b", 30 => "c");

Sie müssen dieses Ergebnis haben:

array(2) {
  [20]=>
  string(1) "b"
  [30]=>
  string(1) "c"
}

Mit array_search den Schlüssel zu bekommen und nehmen Sie sie mit unset wenn gefunden:

if (($key = array_search('word', $array)) !== false) {
    unset($array[$key]);
}

Für assoziative Arrays, mit nicht-ganzzahligen Tasten:

Einfach, unset($array[$key]) funktionieren würde.

Für Arrays ganzzahlige Schlüssel mit und wenn Sie möchten, um Ihre Schlüssel halten:

  1. $array = [ 'mango', 'red', 'orange', 'grapes'];

    unset($array[2]);
    $array = array_values($array);
    
  2. array_splice($array, 2, 1);

Dies kann helfen ...

<?php
    $a1 = array("a"=>"red", "b"=>"green", "c"=>"blue", "d"=>"yellow");
    $a2 = array("a"=>"purple", "b"=>"orange");
    array_splice($a1, 0, 2, $a2);
    print_r($a1);
?>

Das Ergebnis wird sein:

Array ( [0] => purple [1] => orange [c] => blue [d] => yellow )
$arrayName = array( '1' => 'somevalue',
                    '2' => 'somevalue1',
                    '3' => 'somevalue3',
                  );

print_r($arrayName[1]);
// somevalue
unset($arrayName[1]);

print_r($arrayName);

unset den Index nicht ändern, aber array_splice tut:

$arrayName = array('1' => 'somevalue',
                   '2' => 'somevalue1',
                   '3' => 'somevalue3',
                   500 => 'somevalue500',
                  );


    echo $arrayName['500'];
    //somevalue500
    array_splice($arrayName, 1, 2);

    print_r($arrayName);
    //Array ( [0] => somevalue [1] => somevalue500 )


    $arrayName = array( '1' => 'somevalue',
                        '2' => 'somevalue1',
                        '3' => 'somevalue3',
                        500 => 'somevalue500',
                      );


    echo $arrayName['500'];
    //somevalue500
    unset($arrayName[1]);

    print_r($arrayName);
    //Array ( [0] => somevalue [1] => somevalue500 )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top