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