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."
}
答
如果你只需要步行而不需要对数据进行重新编码,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');
你可以给我们一个例子对象吗?那肯定会让它更容易。 – Daan 2015-03-31 10:35:26
对象太长而无法填写评论框。 :( 基本上,它们非常大,我需要应用一些通用的验证。 – darxysaq 2015-03-31 10:38:25
如果您在SQL代码中使用绑定变量,则不需要使用'mysqli_real_escape_string()' – 2015-03-31 10:51:10