2012-12-06 61 views
2

我使用這段代碼來比較兩個php數組,我得到了所有匹配的項目,但不幸的是,我沒有成功獲得不匹配的項目。這是我的代碼。PHP Array使用循環比較

<?php 

$filter1 = "blueberries,abc,cornstarch,sugar"; 
$cval = strtoupper($filter1);   
$parts1 = explode(',',$cval); 

$filter2 = "water,blueberries,sugar,cornstarch"; 
$values = strtoupper($filter2); 
$parts2 = explode(',', $values); 


$m=0; 
$nm=0; 


for($i = 0; $i< count($parts1); $i++) 
{ 

for($j = 0; $j< count($parts2); $j++) 
{ 

if($parts1[$i] == $parts2[$j]) 
{ 
$m++; 
$p[] = $parts1[$i]; 
} 
else{ 
$nm++; 
$q[] = $parts1[$i]; 
} 

} 

} 

echo $m; 
echo "<br />"; 
echo $nm; 
echo "<br />"; 
print_r($p); 
echo "<br />"; 
print_r($q); 

?> 

有人可以幫助我整理出這個問題,因爲我不想使用內置數組進行比較的功能。

+2

使用'array_interesect'和'array_diff' – dognose

+1

對不起,我想使用循環謝謝。 –

+1

這引發了一個問題,爲什麼要使用循環而不是內置函數? –

回答

2

我會用內部功能爲這個(如果我明白你的問題)

匹配:

$matched = array_intersect($parts1, $parts2); 

差異:

$difference = array_diff($parts1, $parts2); 

或者在你的for循環的世界:

<?php 
    $filter1 = "blueberries,abc,cornstarch,sugar"; 
    $cval = strtoupper($filter1); 
    $parts1 = explode(',', $cval); 

    $filter2 = "water,blueberries,sugar,cornstarch"; 
    $values = strtoupper($filter2); 
    $parts2 = explode(',', $values); 

    $matched = $not_matched = array(); 

    for ($i = 0; $i < count($parts1); $i++) 
    { 

     if (in_array($parts1[$i], $parts2)) 
     { 
      $matched[] = $parts1[$i]; 
     } 
     else 
     { 
      $not_matched[] = $parts1[$i]; 
     } 

    } 

    print_r($matched); 
    print_r($not_matched); 
?> 

我一直在努力添加另一個循環,而不是使用in_array(),但我不打算更新我的答案有兩個原因。

1)使用

$matched = array_intersect($parts1, $parts2); 
$difference = array_diff($parts1, $parts2); 

寫的,而不是兩行這麼多的代碼是針對我的宗教。

2)創建這種數量的代碼嚴格不使用array_*in_array函數的唯一原因必須是一些測驗或測試,我想輸入和贏得。

+0

是的,我明白,但我必須使用循環。 –

+0

@NullPointer是他做的,更新回答 – Dale

+0

@Dale yup +1 ... http://codepad.org/AKYWs5TM如果你想添加 –

1

使用array_intersect,和array_diff和array_merge

$filter1 = "blueberries,abc,cornstarch,sugar"; 
$cval = strtoupper($filter1);   
$parts1 = explode(',',$cval); 

$filter2 = "water,blueberries,sugar,cornstarch"; 
$values = strtoupper($filter2); 
$parts2 = explode(',', $values); 

print_r(array_intersect($parts1, $parts2)); 

print_r(array_merge(array_diff($parts1, $parts2), array_diff($parts2, $parts1))); 

陣列([0] =>藍莓[2] => CORNSTARCH [3] =>糖)陣列([0] => ABC [1] = > WATER)

1

你正在做兩個數組的笛卡爾乘積。 如果您發現$parts1[$i] == $parts2[$j],則將$parts1[$i]添加到$p是正確的,但是相反的假設(如果它們不同,則添加到$q)是錯誤的。 您應該從$q中的所有元素開始,當您匹配時,將其添加到$p並從$q中刪除它。

1
<?php 
    $array1 = array("a" => "green", "red", "blue", "red"); 
    $array2 = array("b" => "green", "yellow", "red"); 
    $result = array_diff($array1, $array2); 

    print_r($result); 
    ?> 

這是php的庫函數。