仅当数组存在且不为空时才将其包含到函数中

时间:2019-07-08 20:07:32

标签: php arrays

我有一个函数,可以对多个数组进行随机组合并返回一个长数组:

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的新手,为我的凌乱代码感到抱歉。

1 个答案:

答案 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;
}