Para eliminar un elemento de un array de PHP por su clave, usa unset($array[$key]). El elemento desaparece, las demás claves se quedan exactamente como estaban, y hacer unset de una clave que no existe no es un error.
Mira el segundo resultado: ahora las claves son 0, 2, 3. unset nunca renumera.
Reindexar el array después de unset
Una lista con un hueco en sus claves da problemas más adelante: un bucle for ($i = 0; ...) se encuentra con el índice que falta, y json_encode escribe un objeto JSON en lugar de un array. array_values() te devuelve unas claves limpias.
Eliminar por posición con array_splice
array_splice($array, $offset, $length) elimina $length elementos a partir de la posición $offset, renumera las claves y devuelve lo que eliminó. Un desplazamiento negativo cuenta desde el final. En la misma llamada también puede insertar elementos de reemplazo.
array_splice trabaja con posiciones, no con claves: en un array asociativo elimina según el lugar que ocupa en el orden, y conserva las claves de texto. La página de array_slice la compara con array_slice, que copia una parte sin cambiar el original.
Eliminar un elemento por valor
array_diff($array, [$value]) devuelve el array sin todos los elementos iguales a $value, conservando las claves del resto. Para eliminar solo la primera coincidencia, busca su clave con array_search y elimínala con unset.
array_diff compara los valores como cadenas, así que array_diff([1, "1", 2], [1]) elimina tanto el entero como la cadena. Cuando la condición es algo más que "igual a este valor", usa array_filter con un callback.
Eliminar el primer o el último elemento
array_shift() elimina el primer elemento y array_pop() el último. Las dos devuelven el elemento eliminado, lo que las hace prácticas para colas y pilas.
array_shift renumera las claves numéricas desde 0. array_pop no lo necesita, porque el hueco queda al final.
Eliminar varias claves a la vez
unset acepta varios elementos en una llamada. Para eliminar una lista de claves que tienes en un array, inviértela con array_flip() para que los nombres se conviertan en claves, y pásala a array_diff_key().
Error frecuente: unset con array_search cuando el valor no está
array_search devuelve false cuando no encuentra nada, y false usado como clave de array se convierte en 0. Así que esta línea borra el primer elemento siempre que el valor no esté en el array:
Guarda siempre el resultado de array_search y compáralo con !== false antes de usarlo como clave. Un simple if ($key) tampoco basta: una coincidencia en el índice 0 también es falsy.
Preguntas frecuentes
¿Cómo elimino un elemento de un array por valor en PHP?
Para eliminar todas las apariciones, usa array_diff($arr, ['value']). Para eliminar solo la primera, busca su clave y elimínala con unset, comprobando que se encontró: $k = array_search('value', $arr); if ($k !== false) { unset($arr[$k]); }.
¿Cómo reindexo un array después de unset?
Envuélvelo en array_values(): $arr = array_values($arr); renumera las claves desde 0. Otra opción es eliminar el elemento con array_splice($arr, $index, 1), que renumera por ti.
¿Cómo elimino el primer o el último elemento de un array?
array_shift($arr) elimina y devuelve el primer elemento, y renumera las claves numéricas. array_pop($arr) elimina y devuelve el último elemento.
¿Puedo hacer unset de un elemento dentro de un bucle foreach?
Sí. foreach ($arr as $k => $v) { if ($v < 0) { unset($arr[$k]); } } es seguro, porque foreach recorre una copia del array mientras tú cambias el original. Las claves conservan sus huecos, así que llama después a array_values() si necesitas una lista.
¿Hacer unset de una clave que no existe da un error?
No. unset($arr['missing']) no hace nada y no genera ningún warning, así que no necesitas comprobar antes con isset.