multidimensional - obtener el indice de un array php
Matriz PHP eliminar por valor(no clave) (25)
Tengo una matriz de PHP de la siguiente manera:
$messages = [312, 401, 1599, 3, ...];
Quiero eliminar el elemento que contiene el valor $del_val
(por ejemplo, $del_val=401
), pero no conozco su clave. Esto podría ayudar: cada valor solo puede estar allí una vez .
Estoy buscando la función más sencilla para realizar esta tarea por favor.
Bueno, eliminar un elemento de la matriz es básicamente establecer la diferencia con un elemento.
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
Se generaliza bien, puede eliminar tantos elementos como desee al mismo tiempo, si lo desea.
Descargo de responsabilidad: tenga en cuenta que mi solución produce una nueva copia de la matriz mientras mantiene la anterior intacta en contraste con la respuesta aceptada que muta. Podría ser un poco más lento debido a esto.
Echa un vistazo al siguiente código:
$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 eso te dará esta matriz:
array(''nice_item'', ''another_liked_item'')
La mejor manera es array_splice
array_splice($array, array_search(58, $array ), 1);
Reason for Best está aquí en http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/
La respuesta aceptada, convierte la matriz en una matriz asociativa, por lo que, si desea mantenerla como una matriz no asociativa con la respuesta aceptada, es posible que también tenga que utilizar array_values
.
if(($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
$arr = array_values($messages);
}
La referencia está here
La respuesta de @Bojangles me ayudó. Gracias.
En mi caso, la matriz podría ser asociativa o no, así que agregué esta función
function test($value, $tab) {
if(($key = array_search($value, $tab)) !== false) {
unset($tab[$key]); return true;
} else if (array_key_exists($value, $tab)){
unset($tab[$value]); return true;
} else {
return false; // the $value is not in the array $tab
}
}
Saludos
Mediante el siguiente código, los valores repetitivos se eliminarán de los $ mensajes.
$messages = array_diff($messages, array(401));
O simplemente, de forma manual:
foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
}
Este es el más seguro de ellos porque tienes control total sobre tu matriz
O una sola línea utilizando el operador or
:
array(2) {
[0] => int(4)
[2] => string(1) "3"
}
OK .. Sé que esto no es eficiente en absoluto pero es simple, intuitivo y fácil de leer.
Entonces, si alguien está buscando una solución no tan elegante que se pueda extender para trabajar con más valores o condiciones más específicas ... aquí hay un código simple:
$result = array();
$del_value = 401;
//$del_values = array(... all the values you don`t wont);
foreach($arr as $key =>$value){
if ($value !== $del_value){
$result[$key] = $value;
}
//if(!in_array($value, $del_values)){
// $result[$key] = $value;
//}
//if($this->validete($value)){
// $result[$key] = $value;
//}
}
return $result
Obtener la clave con array_search()
.
Otra idea para eliminar un valor de una matriz, usa array_diff. Si yo quiero
$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));
Para borrar múltiples valores prueba este
while (($key = array_search($del_val, $messages)) !== false)
{
unset($messages[$key]);
}
Puedes referir este URL : para función
array-diff-key()
<?php
$array1 = array(''blue'' => 1, ''red'' => 2, ''green'' => 3, ''purple'' => 4);
$array2 = array(''green'' => 5, ''blue'' => 6, ''yellow'' => 7, ''cyan'' => 8);
var_dump(array_diff_key($array1, $array2));
?>
Entonces la salida debería ser,
array(2) {
["red"]=>
int(2)
["purple"]=>
int(4)
}
Se tomó prestada la lógica de subrayado JS _.reject y creó dos funciones (¡la gente prefiere funciones!)
array_reject_value: esta función simplemente rechaza el valor especificado (también funciona para PHP4,5,7)
function array_reject_value(array &$arrayToFilter, $deleteValue) {
$filteredArray = array();
foreach ($arrayToFilter as $key => $value) {
if ($value !== $deleteValue) {
$filteredArray[] = $value;
}
}
return $filteredArray;
}
array_reject: esta función simplemente rechaza el método invocable (funciona para PHP> = 5.3)
function array_reject(array &$arrayToFilter, callable $rejectCallback) {
$filteredArray = array();
foreach ($arrayToFilter as $key => $value) {
if (!$rejectCallback($value, $key)) {
$filteredArray[] = $value;
}
}
return $filteredArray;
}
Entonces, en nuestro ejemplo actual, podemos usar las funciones anteriores de la siguiente manera:
$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);
o incluso mejor: (ya que esto nos da una mejor sintaxis para usar como el array_filter )
$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
return $value === 401;
});
Lo anterior se puede usar para cosas más complicadas como, digamos, nos gustaría eliminar todos los valores que sean mayores o iguales a 401, simplemente podríamos hacer esto:
$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
return $value >= $greaterOrEqualThan;
});
Según su requerimiento, " cada valor solo puede estar allí una vez " si solo está interesado en mantener valores únicos en su matriz, entonces array_unique()
puede ser lo que está buscando.
Entrada:
$messages=array();
$messages[312] = 312;
$messages[401] = 401;
$messages[1599] = 1599;
$messages[3] = 3;
unset($messages[3]); // no search needed
Resultado:
$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);
Si los valores que desea eliminar están o pueden estar en una matriz. Usa la función array_diff. Parece funcionar muy bien para cosas como esta.
$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
Si no sabes su clave, significa que no importa.
Podría colocar el valor como la clave, esto significa que instantáneamente encontrará el valor. Mejor que usar la búsqueda en todos los elementos una y otra vez.
($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);
Si sabe definitivamente que su matriz contendrá solo un elemento con ese valor, puede hacerlo
$key = array_search($del_val, $array);
if (false !== $key) {
unset($array[$key]);
}
Sin embargo, si su valor puede aparecer más de una vez en su matriz, podría hacer esto
$array = array_filter($array, function($e) use ($del_val) {
return ($e !== $del_val);
});
Nota: la segunda opción solo funciona para PHP5.3 + con Closures
Si tiene> php5.3, hay un código de una línea:
$array = array_filter($array, function($i) use ($value){return $i != $value;});
Una forma interesante es usando array_keys()
:
foreach (array_keys($messages, 401, true) as $key) {
unset($messages[$key]);
}
La función array_keys()
toma dos parámetros adicionales para devolver solo las claves de un valor particular y si se requiere una comprobación estricta (es decir, usar === para la comparación).
Esto también puede eliminar varios elementos de la matriz con el mismo valor (por ejemplo, [1, 2, 3, 3, 4]
).
Usando array_search()
y unset
, intente lo siguiente:
if (($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
}
array_search()
devuelve la clave del elemento que encuentra, que se puede usar para eliminar ese elemento de la matriz original usando unset()
. FALSE
falla, sin embargo, puede devolver un valor falso-y en caso de éxito (su clave puede ser 0
por ejemplo), por lo que se usa la comparación estricta !==
operador.
La instrucción if()
verificará si array_search()
devolvió un valor, y solo realizará una acción si lo hizo.
código de línea única (gracias a array_diff() ), utilice lo siguiente:
$messages = array_diff($messages, array(401));
tu puedes hacer:
unset($messages[array_flip($messages)[''401'']]);
Explicación: elimine el elemento que tiene la clave 401
después de voltear la matriz.
$fields = array_flip($fields);
unset($fields[''myvalue'']);
$fields = array_flip($fields);
function array_remove_by_value($array, $value)
{
return array_values(array_diff($array, array($value)));
}
$array = array(312, 401, 1599, 3);
$newarray = array_remove_by_value($array, 401);
print_r($newarray);
Salida
Array ( [0] => 312 [1] => 1599 [2] => 3 )