2010-03-07 19 views
5

Qual è il modo migliore per rimuovere il parent di una chiave corrispondente in una matrice multidimensionale? Per esempio, supponiamo di avere la seguente array e voglio trovare "[Testo] = a" e quindi eliminare la sua gamma genitore [0] ...Rimuovi genitore nella matrice multidimensionale PHP

(array) Array 
(

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

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

Quindi, si wa non eliminare resto di un 'parent' array e hanno appena il primo nodo dall'array 'parent'? –

+0

Immaginate che l'array sia andato avanti come [0], [1], [2], [3] ... vorrei rimuovere o spostare, [0] fuori. – Andres

risposta

6

Ecco l'ovvio:

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

funziona in un array bidimensionale, ma non in array multidimensionali generali. – nickf

+0

Questa è stata la mia prima ipotesi ma, come hai detto tu, non è ricorsiva. Forse, spingerlo un po 'di più potrebbe aiutare ... – Andres

+0

@Andres: Allora come appare una matrice multidimensionale come quella in cui avresti bisogno di una ricorsione? – Gumbo

2

Gli array interni non mantengono alcun riferimento ai loro array "parent", quindi dovresti scrivere una funzione per tracciarlo manualmente. Qualcosa di simile potrebbe funzionare:

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

Si noti che questo è progettato per funzionare a qualsiasi livello di nidificazione, non solo due dimensioni, quindi potrebbe essere un po 'eccessivo se è necessario solo per situazioni come nel tuo esempio .

+0

prendere nota, la chiave di matrice non può essere numerica. – mauris

+0

@thephpdeveloper: risolto ora, grazie. – nickf

2

utilizzando array_filter:

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

questo lascerà solo «elementi madri dell'array in cui text != a, eliminando quindi quelli in cui il testo è uguale a un

+0

@anime down-voter: cosa c'è di sbagliato nella mia soluzione ?? – knittl

0

La mia implementazione:

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'); 

per testarlo:

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

Questa funzione fa in modo ricorsivo.

0

Una soluzione semplice e sicura (che non avevo rimuovere/elementi non impostate da una matrice Sto scorrendo) potrebbe essere:

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