从数组递归删除键的类方法

时间:2014-03-27 12:11:02

标签: php arrays class recursion phpunit

我正在尝试编写一个简单的类来递归地从数组中删除不需要的键。没什么特别的。

<?php
class RemoveUnwantedKeysFromArrayRecursively {

    public function remove(array &$array, $keys)
    {
        $keys = (is_array($keys)) ? $keys : array($keys);

        foreach ($array as $key => &$value) {
            if(in_array($key, $keys, true)){
                unset($array[$key]);
            }

            if (is_array($value)) {
                $this->remove($value, $key);
            }
        }

        return $array;
    }
} 

但是当我对这个简单的方法进行单元测试时,我得到了嵌套数组的错误,它始终保持不变。

class RemoveUnwantedKeysFromArrayRecursivelyTest extends \PHPUnit_Framework_TestCase {

    public function testRemove()
    {
        $remove = new RemoveUnwantedKeysFromArrayRecursively();

        $arrayTest = array('key1' => 'test', 'key2' => 'test2');
        $arrayKeys = array('key2');

        $remove->remove($arrayTest, $arrayKeys);
        $this->assertTrue(array_key_exists('key1', $arrayTest), 'test if key1 is present');
        $this->assertFalse(array_key_exists('key2', $arrayTest), 'test if key2 is present');

        $nestedArrayTest = array('key1' => 'test', 'key2' => 'test2', 'key3' => array(
        'key1' => 'nested key1', 'key2' => 'nested key2')
    );

        $remove->remove($nestedArrayTest, $arrayKeys);
        $this->assertTrue(array_key_exists('key1', $nestedArrayTest['key3']), 'test if key1 is present in the nested array');
        $this->assertFalse(array_key_exists('key2', $nestedArrayTest['key3']), 'test if key2 is present in the nested array');
    }
}
  

测试嵌套数组中是否存在key2。声明true为false是错误的。

我做错了什么?我的问题类似于PHP Recursively unset array keys if matchPHP recursive search and replace array elements但我没有运气就读过他们的答案。

谢谢。

1 个答案:

答案 0 :(得分:1)

在这里以递归方式调用函数时,你会传递所有$keys而不只是一个$key

$this->remove($value, $key);

另请注意,此上下文中的$key来自原始数组,而不是包含要删除的所有键的数组。