[英]str_replace and ucwords for multidimensional array
我正在努力使$_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'
...
);
有任何幫助或建議嗎?
由於str_replace
不適用於子數組,因此必須在$_POST
每個子$_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 ) );
}
}
我認為您可能可以將array_walk
或array_walk_recursive
與回調一起使用以實現此目的?
array_walk_recursive( $_POST, function($v,$k){
if( $k!='mailaddress' )return ucwords( str_replace( '_',' ', strtolower( $v ) ) );
});
首先,我建議使用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]+
鍵。 我注意到其他所有人都顯式地忽略了Mine忽略非Q
類型的mailaddress
,如果您將不需要修改的其他元素添加到數組中,您可能會發現它有用。 不必顯式地忽略那些“附加”項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.