我正在尝试编写一个简单的类来递归地从数组中删除不需要的键。没什么特别的。
<?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 match和PHP recursive search and replace array elements但我没有运气就读过他们的答案。
谢谢。
答案 0 :(得分:1)
在这里以递归方式调用函数时,你会传递所有$keys
而不只是一个$key
:
$this->remove($value, $key);
另请注意,此上下文中的$key
来自原始数组,而不是包含要删除的所有键的数组。