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";
}

ループの設定が間違っていたようです (vehicle セクションには foreach ループがありましたが、person セクションにはありませんでした)、子ノードが作成されるたびに新しい親ノードを作成していました。

私の解決策では、ループの反復ごとにノードを文字列に直接追加するのではなく、代わりに配列に追加し、その$_POST変数の最後で、2 つの配列を正しい親ノードに一度にダンプします。 .

person セクションまたは vehicle セクションに別の可能なタグを追加する必要がある場合は、$personTagsor$vehicleTags配列にエントリを追加するだけです。

于 2012-05-18T15:18:49.810 に答える
0

コード形式に注意を払うことができます。

foreach の中に foreach があることはあまり明確ではなく、同じ "$key2" と "$value" を使用しています。「}」を間違った場所に作っていると思います。

于 2012-05-18T15:02:46.767 に答える
0

「type equals 've'」の2 番目の if 条件は、foreachがif condition内にあります。

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

しかし、 「type equals '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 に答える