Php 无法递归筛选多维对象数组

Php 无法递归筛选多维对象数组,php,arrays,recursion,multidimensional-array,Php,Arrays,Recursion,Multidimensional Array,我有一个变量,它可能是一个对象或数组。如果它是一个数组,它将是一组对象。每个对象可能有一个参数,该参数是另一个对象或对象数组。所有阵列的深度可能为n级 所有对象都有一个参数“isAccessible”。此参数的值可以是true或false 如果为false,则必须从结构中删除该对象 我尝试过数组_过滤器,因为我不能像前面描述的那样进行递归过滤,所以我编写了一个自滚递归函数 然而,我一直无法让它工作。这是我的密码: public static function jsonGateway($json)

我有一个变量,它可能是一个对象或数组。如果它是一个数组,它将是一组对象。每个对象可能有一个参数,该参数是另一个对象或对象数组。所有阵列的深度可能为n级

所有对象都有一个参数“isAccessible”。此参数的值可以是true或false

如果为false,则必须从结构中删除该对象

我尝试过数组_过滤器,因为我不能像前面描述的那样进行递归过滤,所以我编写了一个自滚递归函数

然而,我一直无法让它工作。这是我的密码:

public static function jsonGateway($json) {
    $object = json_decode($json);
    $newJSON = '';

    // $object may be a stdClass Object or it may be an array of stdClass Objects
    // An objects parameters may be a string, integer, or an array of stdClass Objects.
    // This function must recurse arbitrarily deep
    // Any object where isAccessible = 0 must be purged (numeric string or int?)

    if (is_object($object)) {
        if ($object->isAccessible == 1 || $object->isAccessible == '1' || $object->isAccessible == true) {
            $newJSON = $json;
        }
    } else if (is_array($object)) {
        $newJSON = json_encode(self::filterRecursive($object));
    }

    echo $newJSON;
}

public static function filterRecursive(Array $source) {
    $result = array();

    foreach ($source as $key => $value) {
        if (is_object($value)) {
            $object = $value; // Just a comprehension aid
            if ($object->isAccessible == 1 || $object->isAccessible == '1' || $object->isAccessible == true) {
                // Keep this object
                // This objec though, may have a parameter which is an array
                // If so, we need to recurse
                $objectVars = get_object_vars($object);

                if (count($objectVars) > 0) {
                    foreach ($objectVars as $objectParameter => $objectValue) {
                        if (is_object($objectValue)) {
                            if ($object->isAccessible == 1 || $object->isAccessible == '1' || $object->isAccessible == true) {
                                $object[$objectParameter] = $objectValue;
                            }
                        } else if (is_array($objectValue)) {
                            $object[$objectParameter] = self::filterRecursive($objectValue); // Line 177
                        }
                    }
                }

                $result[$key] = $object;
            } else {
                // don't need this block
                error_log("deleting: " . print_r($object,true));
            }
        }

        if (is_array($value)) {
            $array = $value; // Just a comprehension aid
            $result[$key] = self::FilterRecursive($array);
            continue;
        }
    }

    return $result;
}
我不仅无法成功过滤任何内容,而且还出现以下错误:

PHP Fatal error:  Cannot use object of type stdClass as array in /home1/lowens/public_html/dev/classes/Lifestyle/RBAC.php on line 177
您能帮忙吗?

解决方案:

/**
 * @param array $array
 * @return array
 */
public static function filterArray(Array $array) {
    $result = array();

    foreach ($array as $key => $value) {
        if (is_object($value)) {
            $newObject = self::filterObject($value);
            if (count(get_object_vars($newObject)) > 0) {
                $result[$key] = $newObject;
            }
        } else if (is_array($value)) {
            $newArray = self::filterArray($value);
            if (count($newArray) > 0) {
                $result[$key] = $newArray;
            }
        } else {
            $result[$key] = $value;
        }
    }

    return $result;
}

/**
 * @param \stdClass $object
 * @return \stdClass
 */
public static function filterObject(\stdClass $object) {
    $newObject = new \stdClass();

    if ($object->isAccessible == 1) {
        $objectVars = get_object_vars($object);

        foreach ($objectVars as $objectParameter => $objectValue) {
            if (is_object($objectValue)) {
                $newObject->$objectParameter = self::filterObject($objectValue);
            } else if (is_array($objectValue)) {
                $newObject->$objectParameter = self::filterArray($objectValue);
            } else {
                $newObject->$objectParameter = $objectValue;
            }
        }
    }

    return $newObject;
}

代码中的第177行在哪里?即
第177行
?您只需将
true
作为第二个参数传递给
json_decode()
,它将为您将对象转换为关联数组。它已标记,但在一条长线上,您需要向右滚动$对象[$objectParameter]=self::filterRecursive($objectValue);//第177行我已经解决了177问题。我在分配$object[$objectParameter]时,本应执行$object->$objectParameter。但我仍然没有过滤掉那些不可访问的对象。