2011-02-09 15 views
1

私はこのように、多次元配列を取り、HTMLフォームフィールドに変換しようとしている:ここで多次元配列をHTMLフォームフィールドに変換する方法?

<input type="hidden" name="c_record[contact][0][name]" value="First Last"> 
<input type="hidden" name="c_record[contact][0][date_submitted][date]" value="2010-01-01"> 
<input type="hidden" name="c_record[contact][0][date_submitted][hour]" value="10"> 
<input type="hidden" name="c_record[contact][0][date_submitted][min]" value="08"> 
<input type="hidden" name="c_record[contact][0][date_submitted][sec]" value="16"> 
<input type="hidden" name="c_record[contact][0][ip_address]" value="192.168.1.1"> 

は、私がこれまで持っているものです。

$fields = array(
    'c_record' => array(
     'contact' => array(
      0 => array(
       'name' => 'First Last', 
       'date_submitted' => array(
        'date' => '2010-01-01', 
        'hour' => '10', 
        'min' => '08', 
        'sec' => '16', 
       ), 
       'ip_address' => '192.168.1.1', 
      ), 
     ), 
    ), 
); 
$form_html = array_to_fields($fields); 

function array_to_fields($fields, $prefix = '') { 
    $form_html = ''; 

    foreach ($fields as $name => $value) { 
     if (! is_array($value)) { 
      if (! empty($prefix)) { 
       $name = $prefix . '[' . $name . ']'; 
      } 
      // generate the hidden field 
      $form_html .= Form::hidden($name, $value) . EOL; 
     } else { 
      if (! empty($prefix)) { 
       $prefix .= '[' . $name . ']'; 
      } else { 
       $prefix = $name; 
      } 
      $form_html .= array_to_fields($value, $prefix); 
     } 
    } 

    return $form_html; 
} 

これはIP_ADDRESSまで正常に動作し、ここでの結果:IP_addressはそれらに追加、前のフィールド名を持つ維持した後

<input type="hidden" name="c_record[contact][0][date_submitted][ip_address]" value="192.168.1.1"> 

し、任意の追加フィールド。

どうすればこの作品を作成できますか?

答えて

1

再帰関数に渡す前に、現在のスコープで$ prefixを更新しています。あなたはそれをしたくありません。多値配列の場合は、現在の関数の次の反復でプレフィックスにprevioust配列の名前が含まれることを意味します。これを回避するには、$ prefixに依存しない再帰関数に更新された接頭辞を渡します。

function array_to_fields($fields, $prefix = '') { 
$form_html = ''; 

foreach ($fields as $name => $value) { 
    if (! is_array($value)) { 
     if (! empty($prefix)) { 
      $name = $prefix . '[' . $name . ']'; 
     } 
     // generate the hidden field 
     $form_html .= Form::hidden($name, $value) . EOL; 
    } else { 
     if (! empty($prefix)) { 
      $subprefix = $prefix . '[' . $name . ']'; 
     } else { 
      $subprefix = $name; 
     } 
     $form_html .= array_to_fields($value, $subprefix); 
    } 
} 

return $form_html; 
} 

ことを試してみてください。ハックと一時的な解決策として

+0

良いが、今だけ取得 'の'( '' c_record [連絡先]を欠落しています)。何か案は? –

0

それはいまいましい醜いと柔軟ではないのですが、私は、次のことをやった:

foreach ($fields as $name1 => $value1) { 
     if (! is_array($value1)) { 
      $form_html .= Form::hidden($name1, $value1) . EOL; 
     } else { 
      foreach ($value1 as $name2 => $value2) { 
       if (! is_array($value2)) { 
        $form_html .= Form::hidden($name1 . '[' . $name2 . ']', $value2) . EOL; 
       } else { 
        foreach ($value2 as $name3 => $value3) { 
         if (! is_array($value3)) { 
          $form_html .= Form::hidden($name1 . '[' . $name2 . '][' . $name3 . ']', $value3) . EOL; 
         } else { 
          foreach ($value3 as $name4 => $value4) { 
           if (! is_array($value4)) { 
            $form_html .= Form::hidden($name1 . '[' . $name2 . '][' . $name3 . '][' . $name4 . ']', $value4) . EOL; 
           } else { 
            foreach ($value4 as $name5 => $value5) { 
             if (! is_array($value5)) { 
              $form_html .= Form::hidden($name1 . '[' . $name2 . '][' . $name3 . '][' . $name4 . '][' . $name5 . ']', $value5) . EOL; 
             } else { 
              foreach ($value5 as $name6 => $value6) { 
               if (! is_array($value6)) { 
                $form_html .= Form::hidden($name1 . '[' . $name2 . '][' . $name3 . '][' . $name4 . '][' . $name5 . '][' . $name6 . ']', $value6) . EOL; 
               } else { 
                throw new Kohana_Exception('There are no levels than are supported by array_to_fields . Ending entire loop'); 
               } 
              } 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
3

それが自然にしわくちゃ、一緒にキーを作成しますので、あなたは、この目的のためにサービスにhttp_build_queryをmanhandleことができあなたが探しています。キーや値の=または&が安全にエンコードされるため、または&が安全にエンコードされるため、キーと値の末尾がurldecodeになるまで待つと、出力が爆発しやすくなります。

function array_to_fields($array) { 
    $html = ''; 

    $entries = explode('&', http_build_query($array)); 
    foreach ($entries as $entry) { 
     list($key, $value) = explode('=', $entry); 
     $html .= Form::hidden(urldecode($key), urldecode($value)) . EOL; 
    } 

    return $html; 
} 
+0

賢い解決策! –