PHP - 递归迭代json对象

问题描述:

我需要遍历PHP中的对象,并对此对象中的每个值应用某个函数。 对象是绝对任意的。它们可以包括变量,另一个对象,数组,对象数组等等......PHP - 递归迭代json对象

有没有一种通用的方法来做到这一点?如果是,如何?

用法示例: 以JSON格式接收请求的RESTful API。 json_decode()在请求体上执行并创建一个任意对象。 现在,例如,在进一步验证之前,对此对象中的每个值执行mysqli_real_escape_string()都是很好的做法。

对象的实例:

{ 
    "_id": "551a78c500eed4fa853870fc", 
    "index": 0, 
    "guid": "f35a0b22-05b3-4f07-a3b5-1a319a663200", 
    "isActive": false, 
    "balance": "$3,312.76", 
    "age": 33, 
    "name": "Wolf Oconnor", 
    "gender": "male", 
    "company": "CHORIZON", 
    "email": "[email protected]", 
    "phone": "+1 (958) 479-2837", 
    "address": "696 Moore Street, Coaldale, Kansas, 9597", 
    "registered": "2015-01-20T03:39:28 -02:00", 
    "latitude": 15.764928, 
    "longitude": -125.084813, 
    "tags": [ 
    "id", 
    "nulla", 
    "tempor", 
    "do", 
    "nulla", 
    "laboris", 
    "consequat" 
    ], 
    "friends": [ 
    { 
     "id": 0, 
     "name": "Casey Dominguez" 
    }, 
    { 
     "id": 1, 
     "name": "Morton Rich" 
    }, 
    { 
     "id": 2, 
     "name": "Marla Parsons" 
    } 
    ], 
    "greeting": "Hello, Wolf Oconnor! You have 3 unread messages." 
} 
+1

你可以给我们一个例子对象吗?那肯定会让它更容易。 – Daan 2015-03-31 10:35:26

+0

对象太长而无法填写评论框。 :( 基本上,它们非常大,我需要应用一些通用的验证。 – darxysaq 2015-03-31 10:38:25

+0

如果您在SQL代码中使用绑定变量,则不需要使用'mysqli_real_escape_string()' – 2015-03-31 10:51:10

如果你只需要步行而不需要对数据进行重新编码,json_decode()的第二个参数$assoc将导致它返回一个关联数组。从那里开始,array_walk_recursive()应该适合你以后的工作。

$data = json_decode($source_object); 
$success = array_walk_recursive($data, "my_validate"); 

function my_validate($value, $key){ 
    //Do validation. 
} 

function RecursiveStuff($value, $callable) 
{ 
    if (is_array($value) || is_object($value)) 
    { 
     foreach (&$prop in $value) { 
      $prop = RecursiveStuff($prop); 
     } 
    } 
    else { 
     $value = call_user_func($callable, $value); 
    } 
    return $value; 
} 

而且使用它像:

$decodedObject = RecursiveStuff($decodedObject, function($value) 
{ 
    return escapesomething($value); // do something with value here 
}); 

您只需通过函数名称,如:

$decodedObject = RecursiveStuff($decodedObject, 'mysqli_real_escape_string');