dppn67180 2010-12-15 15:52
浏览 53
已采纳

当某些特定值与给定数组匹配时,从多维数组中删除键

I'm sure I'm only facing a logical problem here.

I have an array like this :

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

                                )

                        )

                )

        )
)

I would like to remove some keys when inf:name matches the given names.

Here is my test function :

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

The desired output must be :

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


                )

        )
)

The $newarray keys must be reset. Because I might face other problems later if they aren't reset.

Thank you guys.

  • 写回答

2条回答 默认 最新

  • dpyoh6553 2010-12-15 21:01
    关注

    This seems to work:

    <?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>';
    
    ?>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入