我有一个POST的多维数组
[key:value key:value[array one {key1:value, key2:value}{key1:value, key2:value}][array two{key1:value, key2:value}...] key:value key:value]
我正在使用嵌套数组生成xml条目,并按如下方式识别它们:
foreach ($_POST as $key){
if (is_array($key)){
foreach ($key as $key2 => $value){
$array_type = substr($key2, 0,2);
if ($array_type == 'ec'){
$xml .= '<tns:PersonNamesInfoType>';
if ($key2 == 'ec_fname'){
$xml .= '<GivenName>'.$value.'</GivenName>';
//<MidInitial>MidInitial</MidInitial>
}
else if ($key2 == 'ec_lname'){
$xml .= '<FamilyName>'.$value.'</FamilyName>';
//</tns:PersonNamesInfoType>
}
else if ($key2 == 'ec_rel'){
$xml .= ' <Relationship>'.$value.' </Relationship>';
// <tns:PhoneInfoType>
//<tns:PhoneType></tns:PhoneType>
}
else if ($key2 == 'ec_ophone'){
$xml .= '<Number>'.$value.'</Number>';
}
else {
$xml .= '<IsPrimary>'.$value.'</IsPrimary>';
}
$xml .= '</tns:PersonNamesInfoType>';
}
else if($array_type == 've') {
$xml .= '<tns:AutoInfoType>';
foreach ($key as $key2 => $value){
if ($key2 == 'veh_year'){
$xml .= '<Year>'.$value.'</Year>';
}
else if ($key2 == 'veh_make'){
$xml .= '<Make>'.$value.'</Make>';
}
else if ($key2 == 'veh_model'){
$xml .= '<Model>'.$value.'</Model>';
}
else if ($key2 == 'veh_plate'){
$xml .= '<Plate>'.$value.'</Plate>';
}
else if ($key2 == 'veh_state'){
$xml .= '<tns:StateType>'.$value.'</tns:StateType>';
}
else {$xml .= '<IsPrimary>'.$value.'</IsPrimary>';}
}
$xml .= '</tns:AutoInfoType>';
}
}
}
}
这会产生错误的结果
<tns:PersonNamesInfoType>
<GivenName>'.$value.'</GivenName>
</tns:PersonNamesInfoType>
<tns:PersonNamesInfoType>
<FamilyName>'.$value.'</FamilyName>
</tns:PersonNamesInfoType>
Instead of:
<tns:PersonNamesInfoType>
<GivenName>'.$value.'</GivenName>
<FamilyName>'.$value.'</FamilyName>
</tns:PersonNamesInfoType>
根据第一个键值来分隔每个数组的数据的最佳解决方案是什么
1[ec_fname]
1[veh_lname]
2[ec_fname]
2[veh_lname]
答案 0 :(得分:1)
这将满足您的需求,并且更短,更简单,更容易扩展:
$personTags = array(
"ec_fname" => "GivenName",
"ec_lname" => "FamilyName",
"ec_rel" => "Relationship",
"ec_ophone" => "Number"
);
$vehicleTags = array(
"veh_year" => "Year",
"veh_make" => "Make",
"veh_model" => "Model",
"veh_plate" => "Plate",
"veh_state" => "StateType"
);
$xml = "";
foreach ($_POST as $key)
{
if (!is_array($key))
continue;
$personNamesInfoTypes = array();
$autoInfoTypes = array();
foreach ($key as $key2 => $value)
{
$array_type = substr($key2, 0, 2);
if ($array_type == 'ec')
{
if (array_key_exists($key2, $personTags))
$tag = $personTags[$key2];
else
$tag = "IsPrimary";
$personNamesInfoTypes[] = " <{$tag}>{$value}</{$tag}>";
}
else if ($array_type == 've')
{
if (array_key_exists($key2, $vehicleTags))
$tag = $vehicleTags[$key2];
else
$tag = "IsPrimary";
$autoInfoTypes[] = " <{$tag}>{$value}</{$tag}>";
}
}
if (!empty($personNamesInfoTypes))
$xml .= "<tns:PersonNamesInfoType>\n". implode("\n", $personNamesInfoTypes) ."\n</tns:PersonNamesInfoTypes>\n";
if (!empty($autoInfoTypes))
$xml .= "<tns:AutoInfoType>\n". implode("\n", $autoInfoTypes) ."\n</tns:AutoInfoTypes>\n";
}
看起来你的循环设置错误了(车辆部分有一个foreach循环,但是在person部分没有)并且每次创建子节点时都在创建一个新的父节点。
使用我的解决方案,而不是在每次循环迭代时将节点直接添加到字符串,而是将它们附加到数组,然后在该$_POST
变量的末尾,将转储这两个数组一次进入正确的父节点。
如果您必须在人员部分或车辆部分添加其他可能的标签,您只需在$personTags
或$vehicleTags
阵列中添加一个条目。
答案 1 :(得分:0)
您可能会注意您的代码格式。
不太清楚,foreach中有一个foreach,他们正在使用相同的&#34; $ key2&#34;和&#34; $ value&#34;。我猜你做的是&#34;}&#34;在错误的地方。
答案 2 :(得分:0)
“类型等于've'的第二个if条件 foreach 位于 if condition 之内。
else if($array_type == 've') {
$xml .= '<tns:AutoInfoType>';
foreach ($key as $key2 => $value){
但是在初始 if条件 “类型等于'ec'” foreach 在 if条件<之外< / i>因此导致你的问题。
foreach ($key as $key2 => $value){
$array_type = substr($key2, 0,2);
if ($array_type == 'ec'){
我的解决方案
我建议的解决方案很简单......只需将foreach从第4行移到第7行,你的问题就应该解决了(每个需要在 if条件)。
if ($array_type == 'ec'){
$xml .= '<tns:PersonNamesInfoType>';
foreach ($key as $key2 => $value){
我已将完整的解决方案附加到我的答案:)
foreach ($_POST as $key){
if (is_array($key)){
$array_type = substr($key2, 0,2);
if ($array_type == 'ec'){
$xml .= '<tns:PersonNamesInfoType>';
foreach ($key as $key2 => $value){
if ($key2 == 'ec_fname'){
$xml .= '<GivenName>'.$value.'</GivenName>';
//<MidInitial>MidInitial</MidInitial>
}
else if ($key2 == 'ec_lname'){
$xml .= '<FamilyName>'.$value.'</FamilyName>';
//</tns:PersonNamesInfoType>
}
else if ($key2 == 'ec_rel'){
$xml .= ' <Relationship>'.$value.' </Relationship>';
// <tns:PhoneInfoType>
//<tns:PhoneType></tns:PhoneType>
}
else if ($key2 == 'ec_ophone'){
$xml .= '<Number>'.$value.'</Number>';
}
else {
$xml .= '<IsPrimary>'.$value.'</IsPrimary>';
}
}
$xml .= '</tns:PersonNamesInfoType>';
}
else if($array_type == 've') {
$xml .= '<tns:AutoInfoType>';
foreach ($key as $key2 => $value){
if ($key2 == 'veh_year'){
$xml .= '<Year>'.$value.'</Year>';
}
else if ($key2 == 'veh_make'){
$xml .= '<Make>'.$value.'</Make>';
}
else if ($key2 == 'veh_model'){
$xml .= '<Model>'.$value.'</Model>';
}
else if ($key2 == 'veh_plate'){
$xml .= '<Plate>'.$value.'</Plate>';
}
else if ($key2 == 'veh_state'){
$xml .= '<tns:StateType>'.$value.'</tns:StateType>';
}
else {$xml .= '<IsPrimary>'.$value.'</IsPrimary>';}
}
$xml .= '</tns:AutoInfoType>';
}
}
}