Php 将调查问卷转换为对象
希望你能帮助我,我以前确实发现了一些递归,但现在还不是时候。通过问卷调查,我得到了这样一个数组:Php 将调查问卷转换为对象,php,arrays,json,object,recursion,Php,Arrays,Json,Object,Recursion,希望你能帮助我,我以前确实发现了一些递归,但现在还不是时候。通过问卷调查,我得到了这样一个数组: Array ( [Q1] => Array ( [A3] => Array ( [Q11] => Array ( [A11] => Array
Array
(
[Q1] => Array
(
[A3] => Array
(
[Q11] => Array
(
[A11] => Array
(
[Q111] => A112
)
)
[Q12] => Array
(
[A23] => Stackoverflow
)
)
)
[Q2] => A5
)
这些是问题和答案(我不能依赖于它们的索引或前缀,但它们总是成对出现),如果答案是数组,它就有子问题。Q1有A3作为答案,A11作为Q11的嵌套答案,最后A112作为该分支中Q111的最终答案。但Q1也有一个平行子问题,选择了A23,因为它是“其他:”选项,用户输入了文本。最后,第二个问题选择了A5答案
为了更快地进入,这是JSON中的数组:
{"Q1":{"A3":{"Q11":{"A11":{"Q111":"A112"}},"Q12":{"A23":"Stackoverflow"}}},"Q2":"A5"}
现在,我需要得到这样一个对象的结果:
{
"questions": [{
"questionId": "Q1",
"answers": [{
"answerId": "A3",
"questions": [{
"questionId": "Q11",
"answers": [{
"answerId": "A11",
"questions": [{
"questionId": "Q111",
"answers": [{
"answerId": "A112"
}]
}]
}]
},
{
"questionId": "Q12",
"answers": [{
"answerId": "A23",
"answerPhrase": "Stackoverflow"
}]
}
]
}]
},
{
"questionId": "Q2",
"answers": [{
"answerId": "A5"
}]
}
]
}
我确信递归相对简单,但在尝试和迷路之后,我尝试了JSON,结果更糟。我提醒你,Q和A是成对出现的,所以我相信递归应该有两个嵌套循环,但你可能知道得更清楚——我只是不能依赖索引值。提前感谢,PHP向导们
请检查这是否能满足您的需要。它是使用递归函数完成的。唯一不同于我的结果和你想要的结果的是,Q1和Q2处于同一水平,而不是作为答案下的另一个对象。根据你剩下的问题,我认为这是一个打字错误,我所做的将是正确的
$response = json_decode('{"Q1":{"A3":{"Q11":{"A11":{"Q111":"A112"}},"Q12":{"A23":"Stackoverflow"}}},"Q2":"A5"}', true);
function processQuestions($questions)
{
$ret = array();
if(!empty($questions))
{
foreach($questions as $question => $answer)
{
$ret[] = array(
'questionId' => $question,
'answers' => processAnswers($answer),
);
}
}
return $ret;
}
function processAnswers($answers)
{
if(!is_array($answers))
{
return array(array('answerId'=>$answers));
}
$ret = array();
if(!empty($answers))
{
foreach($answers as $answerId=>$answer)
{
$ans = array('answerId'=>$answerId);
if(is_array($answer))
{
$ans['questions'] = processQuestions($answer);
}
else
{
$ans['answerPhrase'] = $answer;
}
$ret[] = $ans;
}
}
return $ret;
}
$result = array('questions'=>processQuestions($response));
嗨@马克,这几乎是完美的!非常优雅的方法,两个函数相互调用。直到现在,答案才是对象数组——即使它只是一个answerId。我已经编辑了代码,是现在吗?更改了processAnswers第24行中的一行,非常完美。非常感谢。是的,产生的JSON是错误的,现在修复了。