我有一个数据库输出数组。我想知道过滤这些值的最简洁方法是什么
示例数组
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 :(得分: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_map和anonymous 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']);
}
?>