2010-03-07 31 views
5

¿Cuál es la mejor manera de eliminar el elemento primario de una clave coincidente en una matriz multidimensional? Por ejemplo, supongamos que tenemos la siguiente matriz y quiero encontrar "[texto] = a" y luego eliminar sus padres gama [0] ...Eliminar principal en matriz multidimensional PHP

(array) Array 
(

[0] => Array 
    (
     [text] => a 
     [height] => 30 
    ) 

[1] => Array 
    (
     [text] => k 
     [height] => 30 
    ) 
) 
+0

Por lo tanto, wa no para eliminar restos de un 'parent' array y tener solo el primer nodo de la matriz 'parent' –

+0

Imagina que la matriz continúa como, [0], [1], [2], [3] ... Eliminaría, o cambiaría, [0] fuera. – Andres

Respuesta

6

Aquí es obvio:

foreach ($array as $key => $item) { 
    if ($item['text'] === 'a') { 
     unset($array[$key]); 
    } 
} 
+0

esto funciona en una matriz bidimensional, pero no en matrices multidimensionales generales. – nickf

+0

Esta fue mi primera suposición, pero, como dijiste, no es recursiva. Tal vez, presionarlo un poco más podría ayudar ... – Andres

+0

@Andres: Entonces, ¿cómo se ve una matriz multidimensional en la que necesitaría recurrencia? – Gumbo

2

Los arreglos interiores no mantienen ninguna referencia a sus matrices "principales", por lo que tendría que escribir una función para realizar un seguimiento manual de esto. Algo como esto podría funcionar:

function searchAndDestroy(&$arr, $needle) { 
    foreach ($arr as &$item) { 
     if (is_array($item)) { 
      if (searchAndDestroy($item, $needle)) { 
       return true; 
      } 
     } else if ($item === $needle) { 
      $item = null; 
      return true; 
     } 
    } 
} 

Tenga en cuenta que esto está diseñado para trabajar en cualquier nivel de anidamiento, no sólo dos dimensiones, por lo que podría ser un poco excesivo si solamente se necesita para situaciones como en su ejemplo .

+0

tome nota, la clave de matriz puede no ser numérica. – mauris

+0

@thephpdeveloper: arreglé eso ahora, gracias. – nickf

2

usando array_filter:

function filter_callback($v) { 
    return !isset($v['text']) || $v['text'] !== 'a'; 
} 
$array = array_filter($array, 'filter_callback'); 

esto sólo dejará "elementos de la controladora de la matriz donde text != a, por lo tanto, la eliminación de aquellas en las que el texto es igual a una

+0

@anonymous down-voter: ¿qué pasa con mi solución? – knittl

0

Mi implementación:

function searchAndDestroy(&$a, $key, $val){ 
    foreach($a as $k => &$v){ 
     if(is_array($v)){ 
      $r = searchAndDestroy(&$v, $key, $val); 
      if($r){ 
       unset($a[$k]); 
      } 
     }elseif($key == $k && $val == $v){ 
      return true; 
     } 
    } 
    return false; 
} 

searchAndDestroy($arr, 'text', 'a'); 

para probarlo:

<pre><?php 

function searchAndDestroy(&$a, $key, $val){ 
    foreach($a as $k => &$v){ 
     if(is_array($v)){ 
      $r = searchAndDestroy(&$v, $key, $val); 
      if($r){ 
       unset($a[$k]); 
      } 
     }elseif($key == $k && $val == $v){ 
      return true; 
     } 
    } 
    return false; 
} 

$arr = array(array('text'=>'a','height'=>'30'),array('text'=>'k','height'=>array('text'=>'a','height'=>'20'))); 

var_dump($arr); 

searchAndDestroy($arr, 'text', 'a'); 

var_dump($arr); 

?></pre> 

Esta función hace de forma recursiva.

0

Una solución simple y segura (no había quitar/elementos no se ha establecido a partir de una matriz que estoy recorriendo) podrían ser:

$new_array = array(); 
foreach($array as $item) 
{ 
    if($item['text'] != "a") 
    { 
     $new_array[] = $item; 
    } 
} 
Cuestiones relacionadas