2012-02-26 59 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

相關問題