2009-11-10 7 views
9

Ich habe das folgende Array, das ich rekursiv Schleife durchlaufen und entfernen Sie alle untergeordneten Arrays, die den Schlüssel "fields" müssen. Ich habe versucht Array-Filter, aber ich habe Probleme, etwas davon zu arbeiten.PHP Rekursiv Array-Schlüssel bei der Übereinstimmung

$myarray = array(
    'Item' => array(
     'fields' => array('id', 'name'), 
     'Part' => array(
      'fields' => array('part_number', 'part_name') 
     ) 
    ), 
    'Owner' => array(
     'fields' => array('id', 'name', 'active'), 
     'Company' => array(
      'fields' => array('id', 'name',), 
      'Locations' => array(
       'fields' => array('id', 'name', 'address', 'zip'), 
       'State' => array(
        'fields' => array('id', 'name') 
       ) 
      ) 
     ) 
    )  
); 

Dies ist, wie ich es das Ergebnis muss wie folgt aussehen: ein Schuss diese Funktion

$myarray = array(
    'Item' => array(
     'Part' => array(
     ) 
    ), 
    'Owner' => array(
     'Company' => array(
      'Locations' => array(
       'State' => array(
       ) 
      ) 
     ) 
    )  
); 
+0

Welcher Wert wird "Part" hat nach dem Entfernen Aktion? – powtac

+0

Ich muss nur "Felder" deaktivieren und Teil als "Array()" – SonnyBurnette

Antwort

28

Wenn Sie rekursiv betreiben wollen, müssen Sie das Array als reference passieren, sonst hat man eine Menge unnötig Kopieren tun:

function recursive_unset(&$array, $unwanted_key) { 
    unset($array[$unwanted_key]); 
    foreach ($array as &$value) { 
     if (is_array($value)) { 
      recursive_unset($value, $unwanted_key); 
     } 
    } 
} 
+0

cool lassen, muss ich unbedingt dieses versuchen! –

+0

Ich bin mir nicht sicher, ob das korrekt ist. Aus dem PHP-Handbuch: Wenn eine Variable, die durch REFERENCE übergeben wird, unset() innerhalb einer Funktion ist, wird nur die lokale Variable zerstört. Die Variable in der aufrufenden Umgebung behält den gleichen Wert wie vor dem Aufruf von unset(). http://php.net/manual/en/function.unset.php – Gerbus

+0

@Gerbus: Diese Aussage gilt nur für die Variable selbst, nicht ihre * Werte * (oder Array-Schlüssel in diesem Fall). Das Ändern des Arrays selbst macht den Verweis auf das übergebene Array nicht ungültig. Mit anderen Worten: Sie wären korrekt, wenn der Code "unset ($ array);" enthielte, aber dieser Code hebt einen Array-Schlüssel auf. – soulmerge

0

Geben. Es wird die Schlüssel mit 'Felder' entfernen und den Rest des Arrays verlassen.

function unsetFields($myarray) { 
    if (isset($myarray['fields'])) 
     unset($myarray['fields']); 
    foreach ($myarray as $key => $value) 
     $myarray[$key] = unsetFields($value); 
    return $myarray; 
} 
1

Mein Vorschlag:

function removeKey(&$array, $key) 
{ 
    if (is_array($array)) 
    { 
     if (isset($array[$key])) 
     { 
      unset($array[$key]); 
     } 
     if (count($array) > 0) 
     { 
      foreach ($array as $k => $arr) 
      { 
       removeKey($array[$k], $key); 
      } 
     } 
    } 
} 

removeKey($myarray, 'Part'); 
+0

isset ist nicht in diesem Fall am besten, sollte array_key_exists verwenden null]; var_dump (isset ($ a ['key'])); // gibt false zurück var_dump (array_key_exists ('key', $ a)); // gibt true zurück –

-1

Gehen Sie das Array rekursiv durch (Verweis) und deaktivieren Sie die relevanten Schlüssel.

clear_fields($myarray); 
print_r($myarray); 

function clear_fields(&$parent) { 
    unset($parent['fields']); 
    foreach ($parent as $k => &$v) { 
    if (is_array($v)) { 
     clear_fields($v); 
    } 
    } 
} 
1
function sanitize($arr) { 
    if (is_array($arr)) { 
     $out = array(); 
     foreach ($arr as $key => $val) { 
      if ($key != 'fields') { 
       $out[$key] = sanitize($val); 
      } 
     } 
    } else { 
     return $arr; 
    } 
    return $out; 
} 

$myarray = sanitize($myarray); 

Ergebnis:

array (
    'Item' => 
    array (
    'Part' => 
    array (
    ), 
), 
    'Owner' => 
    array (
    'Company' => 
    array (
     'Locations' => 
     array (
     'State' => 
     array (
     ), 
    ), 
    ), 
), 
) 
5

Sie

function remove_key(&$a) { 
    if(is_array($a)) { 
     unset($a['fields']); 
     array_walk($a, __FUNCTION__); 
    } 
} 
remove_key($myarray); 
+1

Nette Verwendung von lambda + local constant, funktioniert in PHP 5.3+ – philwinkle

+3

Gibt Array_walk nicht an, dass, wenn Sie ein Element aufheben, dass das "[Verhalten dieser Funktion nicht definiert und unvorhersehbar] ist (http: // php .net/manual/de/function.array-walk.php) "? – greatwitenorth

+0

@ Greatrewitenorth, es sagt das. Das könnte funktionieren, aber es ist wahrscheinlich am besten, es leider zu vermeiden. – Aaron

2
function recursive_unset(&$array, $unwanted_key) { 

    if (!is_array($array) || empty($unwanted_key)) 
     return false; 

    unset($array[$unwanted_key]); 

    foreach ($array as &$value) { 
     if (is_array($value)) { 
      recursive_unset($value, $unwanted_key); 
     } 
    } 
} 
0
function removeRecursive($haystack,$needle){ 
    if(is_array($haystack)) { 
     unset($haystack[$needle]); 
     foreach ($haystack as $k=>$value) { 
      $haystack[$k] = removeRecursive($value,$needle); 
     } 
    } 
    return $haystack; 
} 

$new = removeRecursive($old,'key'); 
-1

ich ein wenig mehr Granularität in Entschärfen Arrays array_walk haben wollen benötigt und ich kam Witz h dieses - mit dem bösen Eval und anderen schmutzigen Tricks.

$post = array(); //some huge array 

function array_unset(&$arr,$path){ 
    $str = 'unset($arr[\''.implode('\'][\'',explode('/', $path)).'\']);'; 
    eval($str); 
} 

$junk = array(); 
$junk[] = 'property_meta/_edit_lock'; 
$junk[] = 'property_terms/post_tag'; 
$junk[] = 'property_terms/property-type/0/term_id'; 
foreach($junk as $path){ 
    array_unset($post,$path); 
} 

// unset($arr['property_meta']['_edit_lock']); 
// unset($arr['property_terms']['post_tag']); 
// unset($arr['property_terms']['property-type']['0']['term_id']); 
+0

Möchten Sie die Abstimmung nach unten kommentieren? –

0

Code:

$sweet = array('a' => 'apple', 'b' => 'banana'); 
$fruits = array('sweet' => $sweet, 'sour' => $sweet); 

function recursive_array_except(&$array, $except) 
{ 
    foreach($array as $key => $value){ 
    if(in_array($key, $except, true)){ 
     unset($array[$key]); 
    }else{ 
     if(is_array($value)){ 
     recursive_array_except($array[$key], $except); 
     } 
    } 
    } 
    return; 
} 

recursive_array_except($fruits, array('a')); 
print_r($fruits); 

Eingang:

Array 
(
    [sweet] => Array 
     (
      [a] => apple 
      [b] => banana 
     ) 

    [sour] => Array 
     (
      [a] => apple 
      [b] => banana 
     ) 

) 

Ausgang:

Array 
(
    [sweet] => Array 
     (
      [b] => banana 
     ) 

    [sour] => Array 
     (
      [b] => banana 
     ) 

) 
Verwandte Themen