Ich muss das Array-Element mit dem angegebenen Wert entfernen:
if (in_array($id, $items)) {
$items = array_flip($items);
unset($items[ $id ]);
$items = array_flip($items);
}
Könnte es kürzer (effizienter) gemacht werden?
Ich muss das Array-Element mit dem angegebenen Wert entfernen:
if (in_array($id, $items)) {
$items = array_flip($items);
unset($items[ $id ]);
$items = array_flip($items);
}
Könnte es kürzer (effizienter) gemacht werden?
Antworten:
Dies kann mit einem einfachen Einzeiler erreicht werden.
Mit diesem Array:
$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');
Du kannst tun:
$arr = array_diff($arr, array('remove_me', 'remove_me_also'));
Und der Wert von $arr
wird sein:
array('nice_item', 'another_liked_item')
Hoffe, es hilft, schönen Code zu schreiben.
array_diff
Funktion ist zerstörungsfrei , es gibt ein neues Array.
$referenced = array_diff($referenced, $items_to_remove);
Ich füge eine zweite Antwort hinzu. Ich habe ein schnelles Benchmarking-Skript geschrieben, um hier verschiedene Methoden auszuprobieren.
$arr = array(0 => 123456);
for($i = 1; $i < 500000; $i++) {
$arr[$i] = rand(0,PHP_INT_MAX);
}
shuffle($arr);
$arr2 = $arr;
$arr3 = $arr;
/**
* Method 1 - array_search()
*/
$start = microtime(true);
while(($key = array_search(123456,$arr)) !== false) {
unset($arr[$key]);
}
echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>';
/**
* Method 2 - basic loop
*/
$start = microtime(true);
foreach($arr2 as $k => $v) {
if ($v == 123456) {
unset($arr2[$k]);
}
}
echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>';
/**
* Method 3 - array_keys() with search parameter
*/
$start = microtime(true);
$keys = array_keys($arr3,123456);
foreach($keys as $k) {
unset($arr3[$k]);
}
echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>';
Die dritte Methode array_keys()
mit dem angegebenen optionalen Suchparameter scheint bei weitem die beste Methode zu sein. Ausgabebeispiel:
499999 left, in 0.090957164764404 seconds
499999left, in 0.43156313896179 seconds
499999left, in 0.028877019882202 seconds
Demnach wäre die Lösung, die ich dann verwenden würde:
$keysToRemove = array_keys($items,$id);
foreach($keysToRemove as $k) {
unset($items[$k]);
}
Wie wäre es mit:
if (($key = array_search($id, $items)) !== false) unset($items[$key]);
oder für mehrere Werte:
while(($key = array_search($id, $items)) !== false) {
unset($items[$key]);
}
Dies würde auch einen Schlüsselverlust verhindern, was ein Nebeneffekt von ist array_flip()
.
Die leistungsstärkste Lösung wäre die Verwendung array_filter
, mit der Sie Ihre eigene Filterfunktion definieren können.
Aber einige könnten sagen, dass es in Ihrer Situation ein bisschen übertrieben ist ...
Eine einfache foreach
Schleife, um durch das Array zu gehen und das Element zu entfernen, das Sie nicht wollen, sollte ausreichen.
So etwas sollte in Ihrem Fall wahrscheinlich den Trick machen:
foreach ($items as $key => $value) {
if ($value == $id) {
unset($items[$key]);
// If you know you only have one line to remove, you can decomment the next line, to stop looping
//break;
}
}
Versuchen Sie array_search ()
array_keys()
scheint besser abzuschneiden als array_search()
bei dieser Aufgabe.
Ihre Lösungen funktionieren nur, wenn Ihr Array eindeutige Werte enthält
Sehen:
<?php
$trans = array("a" => 1, "b" => 1, "c" => 2);
$trans = array_flip($trans);
print_r($trans);
?>
Ein besserer Weg wäre, mit array_search in einer Schleife, falls erforderlich, nicht gesetzt zu werden.
function deleteValyeFromArray($array,$value)
{
foreach($array as $key=>$val)
{
if($val == $value)
{
unset($array[$key]);
}
}
return $array;
}
Sie können die Funktion array_splice für diese Operation verwenden. Ref: array_splice
array_splice($array, array_search(58, $array ), 1);