用于清除输出的PHP数组回调函数

时间:2009-11-09 15:35:56

标签: php sql arrays

我有一个数据库输出数组。我想知道过滤这些值的最简洁方法是什么

示例数组

Array
(
    [0] => Array
        (
            [title] => title 1
            [cat_title] => Drawings
            [sec_title] => Portfolio
        )

    [1] => Array
        (
            [title] => title 2
            [cat_title] => Paintings
            [sec_title] => Portfolio
        )

    [2] => Array
        (
            [title] => title 3
            [cat_title] => Drawings
            [sec_title] => Portfolio
        )
)

作为一个例子,最简单的方法是将所有cat_title设置为大写,将所有sec_title设置为htmlspecialchars?

我在想,如果我对数组进行了不正确的排序,我可以使用数组映射函数。像这样

不正确的数组

Array
(
    [title] => Array
        (
            [0] => title 1
            [1] => title 2
            [2] => title 3
        )

    [cat_title] => Array
        (
            [0] => Drawings
            [1] => Paintings
            [2] => Drawings
        )

)

然后我可以做一些方便的事情:

array_map('strtoupper', $array['cat_title']);

并将所有cat_titles一次性大写。这样的事情肯定会打败这个,这是我现在正在进行的事情

$count = count($array);
for($i=0; $i < $count; $i++) { 
    //filter list output
    if (isset($array[$i]['cat_title'])) {
        $array[$i]['cat_title'] = strtoupper($array[$i]['cat_title']);
    }
}

你们知道吗?无论如何我可以在编号数组上回调函数,然后在上面更优雅一点?希望没有错误地排序数组?像array_map或array_walk?

5 个答案:

答案 0 :(得分:2)

真正优雅的方法是不使用关联数组:创建一个对象数组。将您的元素转换为具有构造函数的类,并将title,cat_title和sec_title作为字段。然后将它们设为私有并使用setter(或使用构造函数),您将检查数据并执行所需的任何验证或转换。

答案 1 :(得分:1)

您可以使用array_walk执行此操作,它类似于:

function cleanData( &$item, $key )
{
  $item['cat_title'] = strtoupper( $item['cat_title'] );
  $item['sec_title'] = htmlspecialchars( $item['sec_title'] );
}

array_walk( $arr, 'cleanData' );

然而,像htmlspecialchars这样的功能实际上只是在您实际向浏览器发送内容的最后时刻。在此之前,您希望使用原始文本,并在模板/视图文件中使用<?=htmlspecialchars($var)?>。否则,如果您将编码数据发送到数据库,然后检索并再次运行htmlspecialchars,则最终会出现编码问题。


更新:这是我用来测试的代码;这对我来说可以。我使用的是PHP 5.2,但版本4 +的功能没有任何区别。

$arr = array(
    array( 'title' => 'title 1', 'cat_title' => 'Drawings', 'sec_title' => 'Portfolio' ),
    array( 'title' => 'title 2', 'cat_title' => 'Paintings', 'sec_title' => 'Portfolio' ),
    array( 'title' => 'title 3', 'cat_title' => 'Drawings2', 'sec_title' => 'Portfolio' )
);


array_walk( $arr, 'cleanData' );
echo '<pre>', print_r($arr, true), '</pre>';

输出:

Array
(
    [0] => Array
        (
            [title] => title 1
            [cat_title] => DRAWINGS
            [sec_title] => Portfolio
        )

    [1] => Array
        (
            [title] => title 2
            [cat_title] => PAINTINGS
            [sec_title] => Portfolio
        )

    [2] => Array
        (
            [title] => title 3
            [cat_title] => DRAWINGS2
            [sec_title] => Portfolio
        )

)

答案 2 :(得分:0)

我的解决方案是使用array_mapanonymous functions

<?php
$data = array_map(
    function($element) {
        $element['cat_title'] = strtoupper($element['cat_title']);
        $element['sec_title'] = htmlentities($element['sec_title']);
        return $element;
    },
    $data);
?>

如果你正在使用PHP&lt; 5.3你必须将函数放在其他地方,因为这些匿名函数是5.3特性。

答案 3 :(得分:0)

我想你可以简单地使用array_keys,至少可以让你在更基本的层面上访问你想要的一切:

foreach( $holder as $subarr )
{
    $keys = array_keys( $subarr );
    foreach( $keys as $key )
    {
        switch( $key ):
        {
            case 'cat_title':
                $subarr[ $key ] = strtoupper( $subarr[ $key ] );
                break;
            default:                    
                $subarr[ $key ] = htmlspecialchars( $subarr[ $key ] );
        }
    }
}

不可否认,这个解决方案比你需要的更详细,但它会起作用。

答案 4 :(得分:0)

我建议使用foreach-loop,因为它会节省不必要的函数调用的开销。

<?php
foreach ($array as &$item) {
  $item['cat_title'] = strtoupper($item['cat_title']);
  $item['sec_title'] = htmlentities($item['sec_title']);
}
?>