Eliminar elemento de matriz por valor

Necesito eliminar el elemento del arreglo con el valor dado:

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

¿Podría hacerse de una manera más corta (más eficiente)?

Se puede lograr con un simple trazador de líneas.

Tener esta matriz:

 $arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also'); 

Tu puedes hacer:

 $arr = array_diff($arr, array('remove_me', 'remove_me_also')); 

Y el valor de $arr será:

 array('nice_item', 'another_liked_item') 

Espero que ayude a escribir un hermoso código.

Estoy agregando una segunda respuesta. Escribí un script de evaluación comparativa rápida para probar varios métodos aquí.

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

El tercer método, array_keys() con el parámetro de búsqueda opcional especificado, parece ser de lejos el mejor método. Ejemplo de salida:

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

A juzgar por esto, la solución que utilizaría sería:

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

Qué tal si:

 if (($key = array_search($id, $items)) !== false) unset($items[$key]); 

o para valores múltiples:

 while(($key = array_search($id, $items)) !== false) { unset($items[$key]); } 

Esto también evitaría la pérdida de clave, que es un efecto secundario de array_flip() .

eliminar $rm_val de $arr

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

La solución más poderosa sería usar array_filter , que le permite definir su propia función de filtrado.

Pero algunos podrían decir que es un poco exagerado, en tu situación …
Un simple bucle foreach para ir a través de la matriz y eliminar el elemento que no desea debería ser suficiente.

Algo como esto, en su caso, probablemente debería hacer el truco:

 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; } } 

sin voltear:

  $value) { if ($id === $value) { unset($items[$key]); } } 

Sus soluciones solo funcionan si tiene valores únicos en su matriz

Ver:

  1, "b" => 1, "c" => 2); $trans = array_flip($trans); print_r($trans); ?> 

Una mejor manera sería desarmarse con array_search , en un bucle si fuera necesario.

Pruebe array_search ()

 function deleteValyeFromArray($array,$value) { foreach($array as $key=>$val) { if($val == $value) { unset($array[$key]); } } return $array; } 

Puede usar la función array_splice para esta operación Ref: array_splice

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