我有一个多维数组,我需要能够用相关值替换JSON占位符。 此外,我还需要能够级联值。
我可能只是错过了一件简单的事情,但它现在已经困扰了我好几天。 如果有人可以为我指出一个问题,我会非常感激。
例如,这是我的数据数组:
$SCREEN = array(
'z5OrfqifU8RiA' =>
array(
'current_status' => 'Completed',
'email' => 'luke@test.com',
'Messages' =>
array(
array(
array(
'type' => 'message',
'messageIndex' => 0,
'ReceivedAt' => '17/11/2017 17:06:23',
'Name' => 'Luke ',
'Message' => 'Hello.'
),
array(
'type' => 'message',
'messageIndex' => 1,
'ReceivedAt' => '17/11/2017 17:06:25',
'Name' => 'Luke2 ',
'Message' => 'Hello back.'
)
)
),
'Message Count' => 2,
)
);
我需要将表示数组值的占位符作为点表示法,并使用通配符将它们替换为正确的字符串OR子数组。
以下是一些前后的例子......
来自:
{ "Messages": "{{SCREEN.Messages}}"}
要
{
"Messages": [
{
"type": "message",
"messageIndex": 0,
"ReceivedAt": "17/11/2017 17:06:23",
"Name": "Luke",
"Message": "Hello."
},{
"type": "message",
"messageIndex": 1,
"ReceivedAt": "17/11/2017 17:07:06",
"Name": "Luke2",
"Message": "Hello back."
}
]
}
来自:
{ "email": "{{SCREEN.email}}"}
要
{ "email": "luke@test.com"}
来自:
{ "everything": "{{SCREEN.*}}"}
要
{
"everything": {
"z5OrfqifU8RiA": {
"current_status": "Completed",
"email": "luke@test.com",
"Messages": [
[
{
"type": "message",
"messageIndex": 0,
"ReceivedAt": "17/11/2017 17:06:23",
"Name": "Luke",
"Message": "Hello."
},
{
"type": "message",
"messageIndex": 1,
"ReceivedAt": "17/11/2017 17:07:06",
"Name": "Luke2",
"Message": "Hello back."
}
]
],
"Message Count": 2
}
}
}
这是当前代码,如果您显式地定位值,但不是使用通配符来获取该键的子节点的数组。
$SCREEN = array(
'z5OrfqifU8RiA' =>
array(
'current_status' => 'Completed',
'email' => 'luke@test.com',
'Messages' =>
array(
array(
array(
'type' => 'message',
'messageIndex' => 0,
'ReceivedAt' => '17/11/2017 17:06:23',
'Name' => 'Luke ',
'Message' => 'Hello.'
),
array(
'type' => 'message',
'messageIndex' => 1,
'ReceivedAt' => '17/11/2017 17:06:25',
'Name' => 'Luke2 ',
'Message' => 'Hello back.'
)
)
),
'Message Count' => 2,
)
);
$X = parseVariables('{ "everything": "{{SCREEN.*}}"}');
$Y = parseVariables('{ "email": "{{SCREEN.email}}"}');
function parseVariables($array) {
GLOBAL $SCREEN;
foreach(flatten($SCREEN) AS $K => $V)$array = MD_ArrayFandR("{{SCREEN.".$K."}}",$V,$array);
return $array;
}
function flatten($array) {
$result = array();
foreach($array as $key=>$value) {
if(is_array($value)) {
$result = $result + flatten($value, $key . '.');
} else {
$result[$key] = $value;
}
}
return $result;
}
function MD_ArrayFandR($Find, $Replace,$Array){
if (is_array($Array)){
$ex=json_encode($Array);
return json_decode(str_replace($Find, $Replace,$ex),true);
} else {
return str_replace($Find, $Replace,$Array);
}
}
print_r($X);
print_r($Y);
答案 0 :(得分:0)
编写一个可以下降到结构中的递归函数,如:
function recurse($foo) {
foreach( $foo as $key => $value ) {
if( is_array($value) ) {
$foo[$key] = recurse($value);
} else if( /* $value is a placeholder */ ) {
$foo[$key] = /* replacement */;
}
}
return $foo
}