[Php] Rimozione della voce dell'array in base al valore


Answers

Sto aggiungendo una seconda risposta. Ho scritto un breve script di benchmark per provare vari metodi qui.

$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>';

Il terzo metodo, array_keys() con il parametro di ricerca opzionale specificato, sembra essere di gran lunga il metodo migliore. Esempio di uscita:

499999 left, in 0.090957164764404 seconds
499999left, in 0.43156313896179 seconds
499999left, in 0.028877019882202 seconds

A giudicare da questo, la soluzione che vorrei utilizzare sarebbe:

$keysToRemove = array_keys($items,$id);
foreach($keysToRemove as $k) {
    unset($items[$k]);
}
Question

Devo rimuovere l'elemento dell'array con un valore dato:

if (in_array($id, $items)) {
    $items = array_flip($items);
    unset($items[ $id ]);
    $items = array_flip($items);
}

Potrebbe essere fatto in un modo più breve (più efficiente)?




È possibile utilizzare la funzione array_splice per questa operazione Ref: array_splice

array_splice($array, array_search(58, $array ), 1);



w / o flip:

<?php
foreach ($items as $key => $value) {
    if ($id === $value) {
        unset($items[$key]);
    }
}



rimuovere $rm_val da $arr

unset($arr[array_search($rm_val, $arr)]);