2012-02-26 91 views
1

对不起,令人困惑的标题...call_user_func_array + array_intersect与一个数组名称的数组,可能吗?

我需要对可变数目的数组执行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); 

在全码我与获得的数据来填充所述阵列中foreach循环FR om sql查询。

+1

'“$ arrayname”'是一个字符串,而不是一个数组。 'call_user_func_array'会将'$ arr_results'中的每个元素作为参数传递给'array_intersect'。 'array_intersect'需要数组作为参数,但'$ arr_results'中的每个项都是一个字符串,而不是一个数组。 – 2012-02-26 19:14:00

+0

我拿$ arrayname并把它变成一个数组,我刚刚更新了代码片段以显示这一点。 – 2012-02-26 19:15:52

+0

如果这是真的,'print_r'会显示一个嵌套数组作为输出,但它显示一个字符串数组。为什么认为'“$ arrayname”'成为一个数组?哪里? *编辑:*'array_push($ arr_results,“$ arrayname”);'向数组添加一个字符串。 PHP不评估字符串。现在并不是'$ arrayname'中的值引用变量名称。为什么不从一开始就创建一个数组数组?这比变量​​变量更容易处理。 – 2012-02-26 19:17:23

回答

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); 

I turn $arrayname into an array with $$arrayname = array();

右键,创建一个变量,可以说arr_0这将指向数组。但变量名称arr_0字符串之间仍然存在差异,其中包含变量名称"arr_0"。你创建了一个字符串数组,这是行不通的。 PHP不知道该字符串包含变量的名称。例如,考虑一下:根据您的逻辑

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

,它应该输出数组的第一个元素,但它没有,因为$arr是一个字符串,而不是一个数组,尽管它包含的名字变量。

你必须使用eval,但你真的不应该。你也可以再次使用可变的变量:

array_push($arr_results, $$arrayname); 

,将工作为好,但正如我所说的,可变的变量是混乱,在99%的情况,你是用数组更好。

+0

我不再收到错误,但是...现在为SQL查询返回的每一行创建一个新的子数组,因此array_intersect不起作用,因为每个数组只有一个条目。 (感谢您的帮助,但很感激)。 – 2012-02-26 19:36:34

+0

是的,我修复了6分钟前的代码;) – 2012-02-26 19:38:49

+0

这仍然返回一个数组,其中SQL查询的每一行都是一个子数组... print_r($ ids)的输出给我: 'Array [0] =>数组 ( [0] => 40 ) [1] =>数组 ( [0] => 42 ) [2] =>数组 ( [0 ] => 61 )' – 2012-02-26 19:47:54