2014-03-27 96 views
1

我想用一个主数组来比较具有索引的子数组。我试过使用array_diffarray_intersect_key等,但无法找到继续的方式,除了使用一个愚蠢的for循环和做一些老派的方法。在PHP中的子阵列比较

好的,让我澄清一下我的问题。比方说,我有两个阵列:

Array 
(
    [0] => H 
    [1] => e 
    [2] => l 
    [3] => l 
    [4] => o 
    [5] => W 
    [6] => o 
    [7] => r 
    [8] => l 
    [9] => d 
    [10] => ! 
) 

Array 
(
    [1] => e 
    [5] => W 
    [7] => r 
    [10] => ! 
) 

第一个是满弦的主阵列:HelloWorld!,第二个是子阵列,其具有一些选定索引和它的值,由用户给出。这也可能是错误的,因为如:

Array 
(
    [1] => F 
    [5] => a 
    [7] => 6 
    [10] => t 
) 

现在,当我通过第一阵列,它显然应该返回true和下一个应该返回false。这可能与使用PHP的内置函数?提前致谢。

回答

1

您应该使用array_intersect_assoc(),如果你还想检查密钥匹配

if (array_intersect_assoc ($a,$b)==$b) {} else {} 

因为$ a是全阵列和$ b子集来测试对。

+0

哇!这工作! :D –

+0

让我们注意''array_diff_assoc($ b,$ a)'以相对简单的方式执行相同的操作... – deceze

0
if (array_diff_assoc($array2, $array1)) { 
    echo 'array 2 is not an exact subset of array 1'; 
} 

array_diff_assoc返回从$array2其不在$array1所有元素。因此,如果数组2是数组1的子集,则返回值为空数组,计算结果为false,否则为非空数组,计算结果为true

0

我觉得array_intersect_uassoc()是你正在寻找的功能。它根据键和值进行比较。这里有一个简单的例子:

$array1 = array(0 => 'h', 1 => 'e', 2 => 'l', 3 => 'o'); 
$array2 = array(0 => 'h', 1 => 'e'); 
$array3 = array(0 => 'h', 1 => 'z'); 
var_dump(array_intersect_uassoc($array1, $array2, 'strcasecmp')); 
var_dump(array_intersect_uassoc($array1, $array3, 'strcasecmp')); 

输出:

array(2) { 
    [0]=> 
    string(1) "h" 
    [1]=> 
    string(1) "e" 
} 
array(1) { 
    [0]=> 
    string(1) "h" 
} 

然后比较返回数组的大小第二数组的大小 - 如果他们是平等的,所有的比赛都是对的。如果返回的数组较小 - 第二个数组中存在错误。

有回调替换strcasecmp()根据自己的喜好和利润:)

干杯

0
$array3 = array_diff($array2,$array1); //array2 is checking either present or not in array1 

,并检查ARRAY3是空的。如果array3是空的,则匹配,如果不是空的,则不匹配。

+0

这不会检查索引! –