2010-12-15 27 views
3

我確信我只在這裏面臨一個邏輯問題。當某些特定值與給定數組匹配時,從多維數組中刪除密鑰

我有一個這樣的數組:

var_export($myarray); 

array (
    0 => 
    array (
    'inf:name' => 'aaa', 
    'inf:value' => '111', 
    'inf:children' => NULL, 
), 
    1 => 
    array (
    'inf:name' => 'bbb', 
    'inf:value' => '222', 
    'inf:children' => NULL, 
), 
    2 => 
    array (
    'inf:name' => 'ccc', 
    'inf:value' => '333', 
    'inf:children' => NULL, 
), 
    3 => 
    array (
    'inf:name' => 'bob', 
    'inf:children' => 
    array (
     0 => 
     array (
     'inf:name' => 'ddd', 
     'inf:value' => '444', 
     'inf:children' => NULL, 
    ), 
    ), 
), 
    4 => 
    array (
    'inf:name' => 'data', 
    'inf:children' => 
    array (
     0 => 
     array (
     'inf:name' => 'eee', 
     'inf:value' => '555', 
     'inf:children' => NULL, 
    ), 
     1 => 
     array (
     'inf:name' => 'steve', 
     'inf:value' => 'bar1', 
     'inf:children' => NULL, 
    ), 
     2 => 
     array (
     'inf:name' => 'john', 
     'inf:value' => 'bar2', 
     'inf:children' => NULL, 
    ), 
     3 => 
     array (
     'inf:name' => 'peter', 
     'inf:value' => 'bar3', 
     'inf:children' => 
     array (
      0 => 
      array (
      'inf:name' => 'fff', 
      'inf:value' => '666', 
      'inf:children' => NULL, 
     ), 
     ), 
    ), 
    ), 
), 
) 


//Or using print_r() 
print_r($myarray); 

Array 
(
    [0] => Array 
     (
      [inf:name] => aaa 
      [inf:value] => 111 
      [inf:children] => 
     ) 

    [1] => Array 
     (
      [inf:name] => bbb 
      [inf:value] => 222 
      [inf:children] => 
     ) 

    [2] => Array 
     (
      [inf:name] => ccc 
      [inf:value] => 333 
      [inf:children] => 
     ) 

    [3] => Array 
     (
      [inf:name] => bob 
      [inf:children] => Array 
       (
        [0] => Array 
         (
          [inf:name] => ddd 
          [inf:value] => 444 
          [inf:children] => 
         ) 

       ) 

     ) 

    [4] => Array 
     (
      [inf:name] => data 
      [inf:children] => Array 
       (
        [0] => Array 
         (
          [inf:name] => eee 
          [inf:value] => 555 
          [inf:children] => 
         ) 

        [1] => Array 
         (
          [inf:name] => steve 
          [inf:value] => bar1 
          [inf:children] => 
         ) 

        [2] => Array 
         (
          [inf:name] => john 
          [inf:value] => bar2 
          [inf:children] => 
         ) 

        [3] => Array 
         (
          [inf:name] => peter 
          [inf:value] => bar3 
          [inf:children] => Array 
           (
            [0] => Array 
             (
              [inf:name] => fff 
              [inf:value] => 666 
              [inf:children] => 
             ) 

           ) 

         ) 

       ) 

     ) 
) 

我想刪除一些按鍵時inf:name給定的名稱匹配。

這是我的測試功能:

function array_cleanup($array, $todelete) 
{ 
    foreach($array as $key => $value) 
    { 
     if(is_array($value)) 
     { 
      $array[$key] = array_cleanup($array[ $key ], $todelete); 
     } else { 
      if(sizeOf($todelete) > 0) 
      { 
       if (in_array($value[ 'inf:name' ], $todelete)) 
        unset($array[ $key ]); 
      } 
     } 
    } 
    return $array; 
} 

$newarray = array_cleanup($myarray, array("aaa", "peter", "ccc")); 

所需的輸出必須是:

var_dump($newarray); 

array (
    0 => 
    array (
    'inf:name' => 'bbb', 
    'inf:value' => '222', 
    'inf:children' => NULL, 
), 
    2 => 
    array (
    'inf:name' => 'bob', 
    'inf:children' => 
    array (
     0 => 
     array (
     'inf:name' => 'ddd', 
     'inf:value' => '444', 
     'inf:children' => NULL, 
    ), 
    ), 
), 
    4 => 
    array (
    'inf:name' => 'data', 
    'inf:children' => 
    array (
     0 => 
     array (
     'inf:name' => 'eee', 
     'inf:value' => '555', 
     'inf:children' => NULL, 
    ), 
     1 => 
     array (
     'inf:name' => 'steve', 
     'inf:value' => 'bar1', 
     'inf:children' => NULL, 
    ), 
     2 => 
     array (
     'inf:name' => 'john', 
     'inf:value' => 'bar2', 
     'inf:children' => NULL, 
    ), 
    ), 
), 
) 

//or using print_r(); 
print_r($newarray); 
Array 
(
    [1] => Array 
     (
      [inf:name] => bbb 
      [inf:value] => 222 
      [inf:children] => 
     ) 

    [2] => Array 
     (
      [inf:name] => bob 
      [inf:children] => Array 
       (
        [0] => Array 
         (
          [inf:name] => ddd 
          [inf:value] => 444 
          [inf:children] => 
         ) 

       ) 

     ) 

    [3] => Array 
     (
      [inf:name] => data 
      [inf:children] => Array 
       (
        [0] => Array 
         (
          [inf:name] => eee 
          [inf:value] => 555 
          [inf:children] => 
         ) 

        [1] => Array 
         (
          [inf:name] => steve 
          [inf:value] => bar1 
          [inf:children] => 
         ) 

        [2] => Array 
         (
          [inf:name] => john 
          [inf:value] => bar2 
          [inf:children] => 
         ) 


       ) 

     ) 
) 

$newarray鍵必須復位。因爲如果他們沒有重置,我可能會在以後遇到其他問題。

謝謝你們。

+0

多少級可深了'INF:children'進行拼圖? – thirtydot 2010-12-15 20:37:26

+0

@stereofrog:檢查更新,@thirtydot:它不應該超過四個級別,但我相信該函數應該遞歸調用,以便它可以適應任何輸入。 – Cybrix 2010-12-15 20:56:59

+0

是從xml數組? – ajreal 2010-12-15 21:02:44

回答

1

這似乎工作:

<?php 

$myarray = array (
    0 => 
    array (
    'inf:name' => 'aaa', 
    'inf:value' => '111', 
    'inf:children' => NULL, 
), 
    1 => 
    array (
    'inf:name' => 'bbb', 
    'inf:value' => '222', 
    'inf:children' => NULL, 
), 
    2 => 
    array (
    'inf:name' => 'ccc', 
    'inf:value' => '333', 
    'inf:children' => NULL, 
), 
    3 => 
    array (
    'inf:name' => 'bob', 
    'inf:children' => 
    array (
     0 => 
     array (
     'inf:name' => 'ddd', 
     'inf:value' => '444', 
     'inf:children' => NULL, 
    ), 
    ), 
), 
    4 => 
    array (
    'inf:name' => 'data', 
    'inf:children' => 
    array (
     0 => 
     array (
     'inf:name' => 'eee', 
     'inf:value' => '555', 
     'inf:children' => NULL, 
    ), 
     1 => 
     array (
     'inf:name' => 'steve', 
     'inf:value' => 'bar1', 
     'inf:children' => NULL, 
    ), 
     2 => 
     array (
     'inf:name' => 'john', 
     'inf:value' => 'bar2', 
     'inf:children' => NULL, 
    ), 
     3 => 
     array (
     'inf:name' => 'peter', 
     'inf:value' => 'bar3', 
     'inf:children' => 
     array (
      0 => 
      array (
      'inf:name' => 'fff', 
      'inf:value' => '666', 
      'inf:children' => NULL, 
     ), 
     ), 
    ), 
    ), 
), 
); 





function array_cleanup($array, $todelete) { 
    foreach ($array as $key => $value) { 
     if (is_array($value)) { 
      if (in_array($value['inf:name'], $todelete)) { 
       unset($array[$key]); 
      } else { 
       $array[$key] = array_cleanup($array[$key], $todelete); 
      } 
     } 
    } 
    return $array; 
} 



$newarray = array_cleanup($myarray, array("aaa", "peter", "ccc")); 
$newarray = array_values($newarray); 

echo '<pre>'; 
var_export($newarray); 
echo '</pre>'; 

?> 
+0

確實,這似乎工作。謝謝。今晚我會進一步測試。 :) – Cybrix 2010-12-15 22:05:29