array_intersect и различен брой масиви

3 отговора 169 прегледа
#1

array_intersect и различен брой масиви

Здравейте,
задачата е следната: разполагам с няколко масива - винаги различен брой между 1 и 5. Тези масиви съдържат някакви ID номера. Идеята е в един краен масив да получа стойностите (ID номерата), които присъстват във всички масиви.

Много удобна е функцията array_intersec, обаче се сблъсках с един проблем - всеки път имам различен брой масиви! Няма как просто всичките да ги предам като параметри, все някой от тях поне веднъж ще остане празен, а принципно празните масиви не трябва да ги използвам. Трябва да правя сравнението само между масиви, пълни с данни.

Какво да направя?

Отговор
в отговор на $burov #2

Re: array_intersect и различен брой масиви

$varArray = array
(
array(1, 2, 3),
array(3, 5, 10),
array(3, 2, 12)
)
$resultArray = $varArray[0];
for($i = 1, $i < count($varArray); $i++) $resultArray = array_intersect($resultArray, $varАrray[$i])

Отговор
в отговор на $burov #3

Re: array_intersect и различен брой масиви

мога да ти предложа една изключително много използвана от мене техника - а именно да използваш call_user_func_array(function, parameters) - на моменти можеш да направиш чудеса с нея...
ето и малко код:


<?php

# initial array
$a=array();
$a[0]=array(1, 2, 4);
$a[1]=array(1, 2, 3, 4);
$a[2]=array();
$a[3]=array(4, 2, 1);

# "parameter" array (only non-empty elements of initial array will be transfered)
$param=array();
foreach($a as $v) if (!empty($v)) $param[]=$v;

# pass non-empty arrays as parameter of user func "array_intersect"
# (in fact it is built-in)
$array=call_user_func_array("array_intersect", $param);

print_r($array);

?>



параметъра $param можеш да си го запълниш както намериш за добре, зависи как ти идват масивите...

ако ти се налага, дори можеш да викнеш метод на обект, достатъчно е за function параметъра да предадеш масив с два елемента от вида

array($objectVar, "methodName")

Just a genius

Отговор
в отговор на Blake #4

Re: array_intersect и различен брой масиви

Благодаря! Този код ми свърши много добра работа.

Отговор