You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

修改说明:

  1. 区分对象与数组:分别用$data->$key(对象)和$data[$key](数组)的方式访问元素,确保遍历和删除操作生效。
  2. 数组重新索引:删除数组元素后,用array_values()重置索引,避免JSON输出时出现非连续的数字键(可选,但符合常规JSON数组格式)。
  3. 移除全局变量依赖:直接使用外部定义的$keysToRemove(若需更严谨可将其作为参数传入函数)。

测试后输出将符合期望,[lovely][2]的"-"元素会被正确删除。


内容的提问来源于stack exchange,提问作者user10492720

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:01:11