2009-11-09 82 views
1

我有一个数据库输出数组。我想知道什么过滤值最彻底的方法是用于清理输出的PHP数组回调函数

例如阵列

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?

+0

为什么你不过滤数据库级别的结果? – knittl 2009-11-09 15:38:37

+0

问题是关于在结果数组上使用回调函数。我无法在数据库级别运行降价。 – user73119 2009-11-09 15:42:40

回答

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


UPDATE:这是我用来测试这个代码;这对我来说可以。我在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 
     ) 

) 
+0

因为数组按数字排序,所以不起作用。这就是为什么我必须在“我目前正在进行的事情”中有这样的陈述。 array_walk = PHP警告:错误的参数数 – user73119 2009-11-09 15:56:58

+0

这是模板之前的最后一步。我有很多不同的实用功能,例如smarty,markdown,日期函数等,只有在发送到模板时才会应用。输出到表单获得不同的功能,并且对数据库的输入也具有不同的功能。 我不希望过滤tempaltes中的所有函数,并将它很好地保存在可以重用和输出的类中。 – user73119 2009-11-09 16:07:40

+0

它适用于我... – DisgruntledGoat 2009-11-09 16:11:31

2

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

+0

这是从对象中出来并进入模板的数组。这些值正在被一个特定于该数据的对象修改。我只想不必: if(isset($ array [$ i] ['cat_title'])){array {$ i] ['cat_title'] = strtoupper($ array [$ i] [ 'cat_title']); } 对于阵列中的每个字段。 如果有一个特定的设计模式,你正在尝试可以提供一个链接或它的名字? – user73119 2009-11-09 15:47:01

+0

如果您定义了自己的类,则可以在构造函数中将所有内容都设置为空字符串,因此不需要使用'isset'。 – DisgruntledGoat 2009-11-09 15:52:32

+0

你能提供一个例子的链接吗?如果我使用pdo,我会使用PDO :: FETCH_OBJ吗?你是这个意思吗?我目前正在使用PDO :: FETCH_ASSOC。因此结束了一个数组。 – user73119 2009-11-09 16:00:48

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 5.3 <你必须把函数在其他地方,因为这些匿名函数是一个5.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 ]); 
     } 
    } 
} 

诚然,这个解决方案比你需要的更详细,但它会起作用。

+0

那么它有点不那么冗长,然后重复和isset业务。感谢您的建议。 – user73119 2009-11-09 16:04:03

0

我会推荐一个foreach循环,因为它会稍微快一点,因为您可以节省不必要的函数调用的开销。

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