簡體   English   中英

str_replace和ucwords用於多維數組

[英]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_walkarray_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循環,使生活更容易一點。 最后一件事是,現在您在頂層數組中僅具有mailaddressQ[0-9]+鍵。 我注意到其他所有人都顯式地忽略了Mine忽略非Q類型的mailaddress ,如果您將不需要修改的其他元素添加到數組中,您可能會發現它有用。 不必顯式地忽略那些“附加”項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM