PHP递归清理JSON元素失效,如何删除数组中的指定值元素?
问题:递归清理函数无法删除数组中指定值的元素
原始PHP数据结构:
Array ( [name] => stdClass Object ( [first] => Andy [middle] => [last] => James ) [age] => 18 [lovely] => Array ( [0] => running [1] => coding [2] => - ) )
需求:删除值为"-"、"N/A"或空字符串的元素,尤其是[lovely][2]这个值为"-"的数组元素,但现有递归函数无法生效。
现有代码:
$keysToRemove = array("N/A", "-", ""); // Recursively iterate through object and remove keys with specified values function cleanObject($obj) { foreach ($obj as $key => $value) { if (is_object($value) || is_array($value)) { $obj->$key = cleanObject($value); } else { if (in_array($value, $GLOBALS['keysToRemove'])) { unset($obj->$key); } } } //print_r($obj); return $obj; }
当前输出(仍保留"-"):
{"name": {"first":"Andy","last":"James"},"age":18, "lovely":["running","coding","-"]}
期望输出:
{"name":{"first":"Andy","last":"James"},"age":18, "lovely":["running","coding"]}
解决方案
问题根源:原函数没有区分数组和对象的处理逻辑——当遍历数组时,依然用$obj->$key的对象属性访问方式,这在数组中是无效的,导致无法正确删除数组元素。
修改后的代码:
$keysToRemove = ["N/A", "-", ""]; function cleanData($data) { // 处理对象 if (is_object($data)) { foreach ($data as $key => $value) { if (is_object($value) || is_array($value)) { $data->$key = cleanData($value); } else { if (in_array($value, $keysToRemove)) { unset($data->$key); } } } } // 处理数组 elseif (is_array($data)) { foreach ($data as $key => $value) { if (is_object($value) || is_array($value)) { $data[$key] = cleanData($value); } else { if (in_array($value, $keysToRemove)) { unset($data[$key]); } } } // 可选:重新索引数组(避免删除元素后出现索引断层) $data = array_values($data); } return $data; }
修改说明:
- 区分对象与数组:分别用
$data->$key(对象)和$data[$key](数组)的方式访问元素,确保遍历和删除操作生效。 - 数组重新索引:删除数组元素后,用
array_values()重置索引,避免JSON输出时出现非连续的数字键(可选,但符合常规JSON数组格式)。 - 移除全局变量依赖:直接使用外部定义的
$keysToRemove(若需更严谨可将其作为参数传入函数)。
测试后输出将符合期望,[lovely][2]的"-"元素会被正确删除。
内容的提问来源于stack exchange,提问作者user10492720
相关产品推荐
相关产品推荐

