简体   繁体   English

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

[英]Remove keys from a multi-dimensional array when some specific values are matching the given array

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. inf:name匹配给定的名称时,我想删除一些键。

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. 必须重置$newarray键。 Because I might face other problems later if they aren't reset. 因为如果不重置我可能会在以后遇到其他问题。

Thank you guys. 感谢大伙们。

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

?>
class Arr
{
    /**
     * Removes all occurences of {needle} in {subject}
     *
     * @return array
     */
    public static function purgeKey(string $needle, array $subject) : array
    {
        foreach ($subject as $key => $value) {
            if (is_array($value)) {
                $subject[$key] = static::purgeKey($needle, $value);
            } else if ($key === $needle) {
                unset($subject[$needle]);
            }
        }

        return $subject;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM