PHP eliminar elementos de la matriz asociativa

100

Tengo una matriz de PHP que se parece a esto:

Index              Key     Value
[0]                1       Awaiting for Confirmation
[1]                2       Assigned
[2]                3       In Progress
[3]                4       Completed
[4]                5       Mark As Spam

Cuando var_dump los valores de la matriz, obtengo esto:

array(5) { [0]=> array(2) { ["key"]=> string(1) "1" ["value"]=> string(25) "Awaiting for Confirmation" } [1]=> array(2) { ["key"]=> string(1) "2" ["value"]=> string(9) "Assigned" } [2]=> array(2) { ["key"]=> string(1) "3" ["value"]=> string(11) "In Progress" } [3]=> array(2) { ["key"]=> string(1) "4" ["value"]=> string(9) "Completed" } [4]=> array(2) { ["key"]=> string(1) "5" ["value"]=> string(12) "Mark As Spam" } }

Quería eliminar Completado y Marcar como spam . Sé que puedo unset[$array[3],$array[4]), pero el problema es que a veces el número de índice puede ser diferente.

¿Hay alguna forma de eliminarlos haciendo coincidir el nombre del valor en lugar del valor clave?

usuario648198
fuente
¿No estoy seguro de haber entendido la pregunta que nos ocupa? ¿Qué quiere decir que a veces el número de índice puede ser diferente?
Simon H

Respuestas:

153

Su matriz es bastante extraña: ¿por qué no usar el keyíndice as, y el valueas ... el valor?

¿No sería mucho más fácil si su matriz se declarara así:

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);

Eso le permitiría usar sus valores de keycomo índices para acceder a la matriz ...

Y podrá usar funciones para buscar los valores, como array_search():

$indexCompleted = array_search('Completed', $array);
unset($array[$indexCompleted]);

$indexSpam = array_search('Mark As Spam', $array);
unset($array[$indexSpam]);

var_dump($array);

Más fácil que con tu matriz, ¿no?



En cambio, con su matriz que se ve así:

$array = array(
    array('key' => 1, 'value' => 'Awaiting for Confirmation'), 
    array('key' => 2, 'value' => 'Asssigned'), 
    array('key' => 3, 'value' => 'In Progress'), 
    array('key' => 4, 'value' => 'Completed'), 
    array('key' => 5, 'value' => 'Mark As Spam'), 
);

Tendrá que recorrer todos los elementos para analizarlos valuey desarmar los elementos correctos:

foreach ($array as $index => $data) {
    if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
        unset($array[$index]);
    }
}
var_dump($array);

Incluso si es posible, no es tan simple ... e insisto: ¿no puede cambiar el formato de su matriz para trabajar con un sistema clave / valor más simple?

Pascal MARTIN
fuente
"Tendrá que recorrer todos los elementos para analizar el valor". Cuando usa array_search, también puede buscar en todos los elementos.
Nicolas Aoki
96
  ...

  $array = array(
      1 => 'Awaiting for Confirmation', 
      2 => 'Asssigned', 
      3 => 'In Progress', 
      4 => 'Completed', 
      5 => 'Mark As Spam', 
  );



  return array_values($array);
  ...
ADFS
fuente
3
Gracias, solo estaba buscando esto.! :)
Ravi Dhoriya ツ
2
bonito y fácil . solo buscando esto
Faisal Mehmood Awan
Esta es la respuesta verdadera, no la que se comprobó.
A.Seddighi
16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

Para matrices 2D ...

$remove = array("Mark As Spam", "Completed");
foreach($arrays as $array){
    foreach($array as $key => $value){
        if(in_array($value, $remove)) unset($array[$key]);
    }
}
Dejan Marjanović
fuente
7

Puedes usar esto

unset($dataArray['key']);
Anirban Das
fuente
3

¿Por qué no utilizar array_diff?

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$to_delete = array('Completed', 'Mark As Spam');
$array = array_diff($array, $to_delete);

Solo tenga en cuenta que su matriz se volverá a indexar.

Mikel Annjuk
fuente
1

Prueba esto:

$keys = array_keys($array, "Completed");

/ edit Como mencionó JohnP, este método solo funciona para matrices no anidadas.

Montaña
fuente
0

La forma de hacer esto es tomar su matriz de destino anidada y copiarla en un solo paso a una matriz no anidada. Elimine la (s) clave (s) y luego asigne la matriz recortada final al nodo anidado de la matriz anterior. Aquí hay un código para hacerlo simple:

$temp_array = $list['resultset'][0];

unset($temp_array['badkey1']);
unset($temp_array['badkey2']);

$list['resultset'][0] = $temp_array;
Nitish Pandey
fuente
0

Estoy un poco en desacuerdo con la respuesta aceptada. A veces, la arquitectura de una aplicación no quiere que se meta con la identificación de la matriz o la hace inconveniente. Por ejemplo, utilizo mucho CakePHP y una consulta de base de datos devuelve la clave principal como un valor en cada registro, muy similar al anterior.

Suponiendo que la matriz no es estúpidamente grande, usaría array_filter. Esto creará una copia de la matriz, menos los registros que desea eliminar, que puede asignar de nuevo a la variable de matriz original.

Aunque esto puede parecer ineficiente, en realidad está muy de moda en estos días que las variables sean inmutables, y el hecho de que la mayoría de las funciones de matriz de php devuelvan una nueva matriz en lugar de jugar con la original implica que PHP quiere que usted también haga esto. Y cuanto más trabajas con matrices y te das cuenta de lo difícil y molesta que es la función unset (), este enfoque tiene mucho sentido.

De todas formas:

$my_array = array_filter($my_array, 
                         function($el) { 
                            return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                         });

Puede usar cualquier lógica de inclusión (por ejemplo, su campo de identificación) en la función incrustada que desee.

Roger Kaplan
fuente
-1

para uso de elemento de matriz única reset($item)

Ivan Proskuryakov
fuente
La función de reinicio debe usarse para mover el puntero de matriz interno, no para eliminar elementos o desarmar elementos de una matriz. Utilice unset en su lugar. Si su solución funciona, también tiene efectos secundarios no deseados.
David