我有一个函数,可以对多个数组进行随机组合并返回一个长数组:
function array_zip_merge() {
$output = array();
// The loop incrementer takes each array out of the loop as it gets emptied by array_shift().
for ($args = func_get_args(); count($args); $args = array_filter($args)) {
// &$arg allows array_shift() to change the original.
foreach ($args as &$arg) {
$output[] = array_shift($arg);
}
}
return $output;
}
我这样运行它:
$visirezai = array_zip_merge($tretiRezai, $ketvirtiRezai, $sphinxorezaiclean);
问题有时是一个,两个或什至所有数组为空或根本没有设置,并且我收到如下这样的循环错误消息:
Notice: Undefined variable: sphinxorezaiclean in /usr/share/nginx/search.php on line 177
Warning: array_shift() expects parameter 1 to be array, boolean given in /usr/share/nginx/search.php on line 148
Warning: array_shift() expects parameter 1 to be array, boolean given in /usr/share/nginx/search.php on line 148
Warning: array_shift() expects parameter 1 to be array, null given in /usr/share/nginx/search.php on line 148
Warning: array_shift() expects parameter 1 to be array, boolean given in /usr/share/nginx/search.php on line 148
Warning: array_shift() expects parameter 1 to be array, boolean given in /usr/share/nginx/search.php on line 148
Warning: array_shift() expects parameter 1 to be array, boolean given in /usr/share/nginx/search.php on line 148
第177行是$visirezai = array_zip_merge($tretiRezai, $ketvirtiRezai, $sphinxorezaiclean);
所在的位置(我知道根本没有设置sphinxorezaiclean,但有时是这样),而第148行是函数array_zip_merge
所在的位置。
它会一直这样,直到我停止在浏览器中加载网页为止。
我解决这个问题的方法是这样的:首先,我要检查数组是否为空:
$ketvirtiRezai = rezultataiKeturi($q);
$tretiRezai = rezultataiTrys($q);
$ketvirtiEmpty = false;
$tretiEmpty = false;
$sphinxEmpty = false;
if (empty($ketvirtiRezai[0])) {
$ketvirtiEmpty = true;
}
if (empty($tretiRezai[0])) {
$tretiEmpty = true;
}
else {
$tretiRezai = array_slice($tretiRezai, 0, 5);
}
if (isset($sphinxorezai) && !empty($sphinxorezai)) {
$sphinxorezaiclean = array_slice($sphinxorezai, 0, 5);
}
else
{
$sphinxEmpty = true;
}
然后,如果elseif循环,我可以对每个单个数组检查true或false并相应地设置array_zip_merge
函数,从而可以做得很长。
是否有更好的方法将数组添加/删除到array_zip_merge函数。例如,如果$ ketvirtiRezai为空,则如果所有数组均为空,则函数应仅包括$visirezai = array_zip_merge($tretiRezai, $sphinxorezaiclean);
,然后应将$ visirezai设置为空,并且函数完全不运行(我猜这很容易)。如果两个数组为空,则不将$ visirezai设置为不为空的数组。
我是PHP的新手,为我的凌乱代码感到抱歉。
答案 0 :(得分:1)
我认为您只需要使用php函数is_array
,对吗?在您的合并功能中:
function array_zip_merge() {
$output = array();
// The loop incrementer takes each array out of the loop as it gets emptied by array_shift().
for ($args = func_get_args(); count($args); $args = array_filter($args)) {
// &$arg allows array_shift() to change the original.
foreach ($args as $key=>&$arg) {
// check if the argument is actually an array
if (is_array($arg)) {
$output[] = array_shift($arg);
} else {
unset($args[$key]);
}
}
}
return $output;
}