2010-12-15 12 views
3

ここでは論理的な問題に直面していると確信しています。特定の値が指定された配列と一致するときに、多次元配列からキーを削除します。

私はこのような配列があります:私はinf:nameは、指定された名前と一致したときに、いくつかのキーを削除したい

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] => 
             ) 

           ) 

         ) 

       ) 

     ) 
) 

を。

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

+0

@stereofrog:check update、@thirtydot:それは4つ以上のレベルであってはなりませんが、関数はすべての入力に適応できるように再帰的に呼び出されるべきだと思います。 – Cybrix

+0

はxmlの配列ですか? – ajreal

答えて

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

関連する問題