Php 筛选嵌套数组
我试图过滤Php 筛选嵌套数组,php,arrays,parsing,filtering,Php,Arrays,Parsing,Filtering,我试图过滤$\u POST数据,然后将其呈现为HTML,即嵌套数组,深度约为三层。我的结构如下所示: Array ( [books] ==> Array ( [book1] ==> Array ( [0] ==> Title [1] ==> Author ) [book2] ==> Array
$\u POST
数据,然后将其呈现为HTML,即嵌套数组,深度约为三层。我的结构如下所示:
Array
(
[books] ==> Array
(
[book1] ==> Array
(
[0] ==> Title
[1] ==> Author
)
[book2] ==> Array
(
[0] ==> Title
[1] ==> Author
)
)
[articles] ==> Array
(
[article1] ==> Array
(
[0] ==> Journal
[1] ==> Title
)
[article2] ==> Array
(
[0] ==> Journal
[1] ==> Title
)
)
)
我有一种直觉,认为有一种方法可以使用foreach循环和filter_input_数组(使用数组和sanitize参数),但我对PHP非常陌生,很难做到这一点。我已经成功地过滤了其他数组,但我想知道是否有一种优雅的方法可以遍历数组,过滤它们,并返回具有相同结构的对象。我在这里看到两件事,您希望验证输入:
function books_is_valid(array $books) {
foreach ($books as $book) {
if (!$book_is_valid($bool) {
return false;
}
}
return true;
}
function book_is_valid(array $book) {
if (!count($book) === 2) return false;
if (!array_keys($book) === array(0, 1)) return false;
if (!book_title_is_valid($book[0])) return false;
if (!book_author_is_valid($book[1])) return false;
return true;
}
book_title_is_valid($title) {
... # do your checks, return bool
}
book_author_is_valid($author) {
... # do your checks, return bool
}
数据结构复杂,验证也复杂。由于您甚至有不同的复杂数据类型,如book和article,您可以编写一些通用函数来支持这些类型的输入,这样您就可以将重复的代码移动到自己的函数中,并在以后删除重复的代码
然后,您可以使用filter\u input\u array
功能使用特定的过滤器,方法是:
请注意,这只是验证。因此,它将告诉您表单提交总数是否有效。请参阅url:--
array_filter接受一个回调,您可以使用该回调自定义过滤逻辑。这将有助于:
$filtered = array_filter($array, function($el) { return !empty($el['mob']; });
在这里,回调是作为匿名函数提供的。这将递归筛选数据并根据请求返回对象,请在sanitize函数中选择筛选方法。使用此函数可以深入到多个层次,并且具有不对称结构
$arrayData = array (
'books' => array ( array ( 'Title1','Author1' ), array ( 'Title2','Author2' )),
'articles' => array ( array ( 'Journal3','Title3' ), array ( 'Journal3','Title3' ))
);
function arrayFilter($arrayIn){
$output = null;
if (is_array($arrayIn)){
foreach ($arrayIn as $key=>$val){
if (is_array($val)){
$output->{$key} = arrayFilter($val);
} else {
$output->{$key} = sanitize($val);
}
}
} else {
$output->{$key} = sanitize($val);
}
return $output;
}
function sanitize($val)
{
//insert your preferred data filter here
return addslashes('filtered: '.$val);
}
print_r (arrayFilter($arrayData));
输出:
stdClass Object
(
[books] => stdClass Object
(
[0] => stdClass Object
(
[0] => filtered: Title1
[1] => filtered: Author1
)
[1] => stdClass Object
(
[0] => filtered: Title2
[1] => filtered: Author2
)
)
[articles] => stdClass Object
(
[0] => stdClass Object
(
[0] => filtered: Journal3
[1] => filtered: Title3
)
[1] => stdClass Object
(
[0] => filtered: Journal3
[1] => filtered: Title3
)
)
)
需要什么样的结果数组?基本上相同的结构:[items]->array([books]->array([book1],[book2]),[articles]->array([article1],[article2])。我可以看到做了一系列foreach循环,但我认为可能有一个函数,或者函数的组合,可以做到这一点。可能是过滤、输入、数组、循环等等。好的,你想确保标题、作者等没有特殊字符吗?这太完美了,谢谢。我很高兴能更多地熟悉PHP中的stdClass对象。这不起作用,因为您甚至从原始源代码复制了键入错误。
stdClass Object
(
[books] => stdClass Object
(
[0] => stdClass Object
(
[0] => filtered: Title1
[1] => filtered: Author1
)
[1] => stdClass Object
(
[0] => filtered: Title2
[1] => filtered: Author2
)
)
[articles] => stdClass Object
(
[0] => stdClass Object
(
[0] => filtered: Journal3
[1] => filtered: Title3
)
[1] => stdClass Object
(
[0] => filtered: Journal3
[1] => filtered: Title3
)
)
)