0

我有一个来自 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]
4

3 回答 3

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 循环,但人员部分没有一个),并且每次创建子节点时都在创建一个新的父节点。

使用我的解决方案,不是在每次循环迭代时将节点直接添加到字符串中,而是将它们附加到一个数组中,然后在该$_POST变量的末尾,这两个数组将一次全部转储到正确的父节点中.

如果您必须向人员部分或车辆部分添加另一个可能的标签,您需要做的就是向$personTagsor$vehicleTags数组添加一个条目。

于 2012-05-18T15:18:49.810 回答
0

您可能会注意您的代码格式。

foreach 内部有一个 foreach 并不是很清楚,它们使用相同的“$key2”和“$value”。我猜你把“}”放在了错误的地方。

于 2012-05-18T15:02:46.767 回答
0

您的第二个 if 条件“类型等于've'” foreachif条件内。

else if($array_type == 've') {
$xml .= '<tns:AutoInfoType>';
foreach ($key as $key2 => $value){

但是在“类型等于'ec'”的初始if条件下foreach超出了if条件,因此会给您带来问题。

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>';
               }
}
}
于 2012-05-18T15:03:05.150 回答