如果不是$_POST
字段,我很难让mailaddress
值大写并删除下划线。我几乎在那里,但无法从复选框组数组中删除下划线。此外,我相信,必须有一些更好的方法来优化此代码。
$_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] => 'me@email.com'
...
);
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] => 'me@email.com'
...
);
请任何帮助或侮辱???
答案 0 :(得分: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 ) );
}
}
答案 1 :(得分:3)
我认为您可以使用array_walk
或array_walk_recursive
进行回调来实现这一目标吗?
array_walk_recursive( $_POST, function($v,$k){
if( $k!='mailaddress' )return ucwords( str_replace( '_',' ', strtolower( $v ) ) );
});
答案 2 :(得分:0)
首先,我建议使用var_export($array)
代替print_r($array)
如果查看下面的内容(var_export()的输出),您将看到它的格式正确为PHP代码,与print_r
不同。我之所以这么说,是因为我花了几乎同样多的时间修复数组,就像解决问题一样。您还可以将true
作为第二个参数传递,并将输出作为字符串(参见下文)
$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' => 'me@email.com'
);
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之美)
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' => 'me@email.com',
)
我选择添加这个因为它使用递归函数,当然是你可以在其他地方再使用它。我也在foreach循环中使用引用&
来使生活更容易一些。最后一件事是,您现在只有顶级数组中的mailaddress
和Q[0-9]+
个键。我注意到其他所有人都明确忽略了mailaddress
,我忽略了非Q
类型,如果你向数组中添加了你不想修改的其他元素,你会发现它很有用。而不必明确忽略那些“额外”项目。