2017-07-30 17 views
1

mailaddressフィールドでない場合、$_POSTの値を大文字にしてアンダースコアを削除するのが苦労しています。私はほとんどそこにありますが、アンダースコアをチェックボックスグループ配列から削除することはできません。また、私は、このコードを最適化するにはもっと良い方法があると信じています。多次元配列のstr_replaceとucwords

$_POST = str_replace('_', ' ', $_POST); 

foreach ($_POST as $k => $v) { 
    if (! is_array($v) && $k != 'mailaddress') { 
     $_POST[ $k ] = ucwords($v); 
    } else if (is_array($v)) { 
     $_POST[ $k ] = array_map('ucwords', $v); 
    } 
} 

入力

Array 
(
    [Q1] => Array 
     (
      [0] => tag 
      [1] => bil_mc 
      [2] => cykel_gang 
     ) 

    [Q2] => 1 3 ganger per manad 
    [Q3] => pa fritiden 
    [Q4] => Array 
     (
      [0] => koper_biljett_i_appen 
      [1] => jojo_reskassa 
      [2] => jojo_period 
      [3] => reser_aldrig_kollektivt 
     ) 

    [mailaddress] => '[email protected]' 

    ... 

); 

最終結果

Array 
(
    [Q1] => Array 
     (
      [0] => Tag 
      [1] => Bil Mc 
      [2] => Cykel Gang 
     ) 

    [Q2] => 1 3 Ganger Per Manad 
    [Q3] => Pa Fritiden 
    [Q4] => Array 
     (
      [0] => Koper Biljett I Appen 
      [1] => Jojo Reskassa 
      [2] => Jojo Period 
      [3] => Reser Aldrig Kollektivt 
     ) 

    [mailaddress] => '[email protected]' 

    ... 

); 

すべてのヘルプやsugessionしてください探しています?

+1

入力した '$ _POST'と期待される出力を共有できますか? –

+3

明らかに、 'str_replace'はサブ配列 –

+0

では置き換えられません。' str_replace() '関数は' foreach() 'に適用する必要があります。 – CoursesWeb

答えて

3

str_replaceはサブアレイでは動作しませんので、あなたが$_POSTのすべての部分配列にそれを使用する必要があります。

foreach ($_POST as $k => $v) { 
    if (! is_array($v) && $k != 'mailaddress') { 
     $_POST[ $k ] = str_replace('_', ' ', ucwords($v)); 
    } else if (is_array($v)) { 
     $_POST[ $k ] = array_map('ucwords', str_replace('_', ' ', $v)); 
    } 
} 
+0

ありがとうございました。解決策はうまくいきました。私は 'array_map'に渡すような方法でstr_replaceを使用できるかどうかわかりませんでした。もう一度私に新しいことを教えてくれてありがとう。 :) –

3

私はあなたがこれを達成するためにコールバックしてarray_walkarray_walk_recursiveを使用することができるかもしれないと思いますか?

array_walk_recursive($_POST, function($v,$k){ 
    if($k!='mailaddress')return ucwords(str_replace('_',' ', strtolower($v))); 
}); 
+0

ご協力ありがとうございます。とても有難い –

0

まず第一に、私はあなたが以下の(でvar_exportからの出力())を見ればあなたがprint_rとは異なり、それが適切にPHPコードとしてフォーマットされています表示されますvar_export($array)の代わりprint_r($array)

を使用してお勧めします。私は、問題を解決するためにアレイを修正するのに殆ど時間がかかりましたので、これを言います。また、それが使用しているため

array (
    'Q1' => 
    array (
     0 => 'Tag', 
     1 => 'Bil Mc', 
     2 => 'Cykel Gang', 
    ), 
    'Q2' => '1 3 Ganger Per Manad', 
    'Q3' => 'Pa Fritiden', 
    'Q4' => 
    array (
     0 => 'Koper Biljett I Appen', 
     1 => 'Jojo Reskassa', 
     2 => 'Jojo Period', 
     3 => 'Reser Aldrig Kollektivt', 
    ), 
    'mailaddress' => '[email protected]', 
) 

が、私はこれを追加することにしました

$A = Array(
    'Q1' => Array(
     0 => 'tag', 
     1 => 'bil_mc', 
     2 => 'cykel_gang' 
    ), 
    'Q2' => '1 3 ganger per manad', 
    'Q3' => 'pa fritiden', 
    'Q4' => Array(
     0 => 'koper_biljett_i_appen', 
     1 => 'jojo_reskassa', 
     2 => 'jojo_period', 
     3 => 'reser_aldrig_kollektivt', 
    ), 
    'mailaddress' => '[email protected]' 
); 

foreach($A as $key => &$value){ 
    //check if the first character of the key is 'Q', I thought about using. 
    // if(preg_match('/^Q[0-9]+$/', $key) - but substr is like 10x faster 
    if(substr($key,0,1) == 'Q') 
     $value = ucUnderline($value);  
} 

function ucUnderline($mixed) 
{ 
    if(is_array($mixed)){ 
     foreach($mixed as &$value){ 
      $value = ucUnderline($value); //recursive 
     } 
     return $mixed; 
    }else{ 
     return ucwords(str_replace('_', ' ', $mixed)); 
    } 
} 

$o = var_export($A, true); 
echo "<code>$o</code>"; 

出力(でvar_exportの美しさを)(下記参照)を2番目のパラメータとしてtrue渡すと、文字列として出力を得ることができます再帰的な関数は、当然の利点ですが、どこかでもう一度それを使うことができます。また、私はforeachループ内の参照&でパスを使用して、少し簡単にするようにしています。最後のことは、今はmailaddressQ[0-9]+のキーがトップレベルの配列にしかないことです。私は他の誰もがmailaddressを明示的に無視していたことに気付きました.Mineは非Qタイプを無視します。変更したくない要素を配列に追加すると便利です。これらの「追加の」アイテムを明示的に無視する必要はありません。