call_user_func_array + array_intersect有一个数组名称数组,可能吗?

时间:2012-02-26 19:12:23

标签: php arrays

对不起令人困惑的标题...

我需要对可变数量的数组执行array_intersect()。要做到这一点,我似乎需要使用call_user_func_array()函数,但是,这似乎不起作用并给我错误:

Warning: array_intersect() [function.array-intersect]: Argument #1 is not an array in...

但是,如果我“print_r”数组以确保我看到它是一个数组:

Array ( [0] => arr_0 [1] => arr_1 ) 

我的代码(修剪后只显示损坏的部分):

$i = 0;
$arr_results = array();
foreach($arr_words as $word) {
    $arrayname = "arr_".$i;
    $$arrayname = array();
    while ($row = mysql_fetch_assoc($search)) {
        array_push($$arrayname, $row['id']);
    }
    array_push($arr_results, "$arrayname");
    $i++
}
$matches = call_user_func_array('array_intersect',$arr_results);

在完整代码中,我使用从sql查询获得的数据填充foreach循环中的数组。

1 个答案:

答案 0 :(得分:1)

来自我的评论:

"$arrayname"是一个字符串,而不是一个数组。 call_user_func_array会将$arr_results中的每个元素作为参数传递给array_intersectarray_intersect期望数组作为参数,但$arr_results中的每个项都是字符串,而不是数组。

您所要做的就是创建一个数组数组而不是数组名:

$arr_results = array();
foreach($arr_words as $word) {
    $ids = array();
    while ($row = mysql_fetch_assoc($search)) {
        $ids[] = $row['id'];
    }
    $arr_results[] = $ids;
}
$matches = call_user_func_array('array_intersect',$arr_results);
  

我将$arrayname转换为$$arrayname = array();

的数组

是的,你创建了一个变量,让我们说arr_0指向数组。但变量名称arr_0与包含变量名称"arr_0"字符串之间仍然存在差异。你创建了一个字符串数组,这是行不通的。 PHP不知道该字符串包含变量的名称。例如,考虑一下:

$arr = "arr_0";
echo $arr[0];

根据你的逻辑,它应该输出数组的第一个元素,但它不会,因为$arr是一个字符串,而不是一个数组,尽管它包含一个变量的名称。

你必须使用eval,但你真的不应该这样做。您还可以再次使用变量变量:

array_push($arr_results, $$arrayname);

也可以,但正如我所说,变量变量令人困惑,在99%的情况下,你最好使用数组。