2010-03-07 14 views
5

Was ist die beste Methode, um das übergeordnete Element eines übereinstimmenden Schlüssels in einem mehrdimensionalen Array zu entfernen? Zum Beispiel, nehmen wir an, wir haben die folgende Array, und ich möchte finden „[text] = a“ und dann seine Mutter Array löschen [0] ...Übergeordnetes Element in mehrdimensionalem PHP-Array entfernen

(array) Array 
(

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

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

Also, Sie wan't löschen Rest eines 'parent' Array und haben nur erste Knoten von "Eltern" -Array? –

+0

Stellen Sie sich vor das Array ging wie, [0], [1], [2], [3] ... Ich würde entfernen oder verschieben [0] heraus. – Andres

Antwort

6

Hier ist das offensichtlich:

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

dies funktioniert in einem zweidimensionalen Array, aber nicht in allgemeinen mehrdimensionalen Arrays. – nickf

+0

Das war meine erste Schätzung, aber, wie Sie sagten, es ist nicht rekursiv. Vielleicht hilft es etwas mehr ... – Andres

+0

@Andres: Wie sieht dann ein solches mehrdimensionales Array aus, wo man eine Rekursion benötigt? – Gumbo

2

Die inneren Arrays pflege keinen Hinweis zu ihren "Eltern" -Arrays, also müssten Sie eine Funktion schreiben, um diese manuell zu verfolgen. So etwas wie dies funktionieren könnte:

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

Beachten Sie, dass diese ausgelegt ist, auf jeder Ebene der Verschachtelung zu arbeiten, nicht nur zwei Dimensionen, so könnte es ein bisschen zu viel des Guten, wenn Sie es brauchen nur für Situationen wie in Ihrem Beispiel .

+0

Beachten Sie, dass der Array-Schlüssel möglicherweise nicht numerisch ist. – mauris

+0

@thepphdeveloper: Das ist jetzt behoben, danke. – nickf

2

array_filter mit:

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

dies nur "Elemente Eltern verlassen wird in der Anordnung, wo text != a daher diejenigen zu löschen, wo Text ein

+0

@anonymous down-voter: was ist los mit meiner Lösung? – knittl

0

gleich Meine Implementierung:

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

es zu testen:

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

Diese Funktion macht es rekursiv.

0

Eine einfache und sichere Lösung (ich würde nicht entfernen/ungesetzt Elemente aus einem Array mir Schleifen) könnten sein:

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