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

标签 php multidimensional-array array-unset

我确定我在这里只面临逻辑问题。

我有一个这样的数组:

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 键。因为如果不重置它们,我以后可能会遇到其他问题。

谢谢你们。

最佳答案

这似乎可行:

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

?>

关于php - 当某些特定值与给定数组匹配时,从多维数组中删除键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4451919/

相关文章:

php - 如何将sql命令转换为laravel eloquent

javascript - 如何在div内的html页面中显示js文件中的json数据

php - 在 Mysql 和 php 中不显示空数据的链接

c++ - 交换内部和外部 vector

php - 将 mysql 值分配到多维数组中

c - 如何在 C 中传递可变大小的多维数组?

php - 如何将 JSON 数组添加到 PHP 中的现有 JSON 中?

PHP 数组未设置

php - 在php中取消设置编码数组后没有索引的json