str_replace和ucwords用于多维数组

时间:2017-07-30 07:13:19

标签: php arrays 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'

    ...

);

请任何帮助或侮辱???

3 个答案:

答案 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_walkarray_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循环中使用引用&来使生活更容易一些。最后一件事是,您现在只有顶级数组中的mailaddressQ[0-9]+个键。我注意到其他所有人都明确忽略了mailaddress,我忽略了非Q类型,如果你向数组中添加了你不想修改的其他元素,你会发现它很有用。而不必明确忽略那些“额外”项目。