2014-05-08 69 views
1

如何獲取包含數據類型的數組的區別?如何獲取編碼到數組中的特定數據類型的區別

第一陣列:

Array 
(
    [0] => Array 
    (
    [ID] => 21323154 
    [NAME] => Name_2 
    [PREVIEW_TEXT] => Text_2 
) 
) 

第二陣列:

Array 
(
    [0] => Array 
    (
    [ID] => 543547564 
    [NAME] => Name_1 
    [PREVIEW_TEXT] => Text_1 
) 
    [1] => Array 
    (
    [ID] => 222213322 
    [NAME] => Name_2 
    [PREVIEW_TEXT] => Text_2 
) 
    [2] => Array 
    (
    [ID] => 333876833 
    [NAME] => Name_3 
    [PREVIEW_TEXT] => Text_3 
) 
) 

結果應該是一個磁盤陣列:

Array 
(
    [0] => Array 
    (
    [ID] => 543547564 
    [NAME] => Name_1 
    [PREVIEW_TEXT] => Text_1 
) 
    [1] => Array 
    (
    [ID] => 333876833 
    [NAME] => Name_3 
    [PREVIEW_TEXT] => Text_3 
) 
) 

我嘗試了不同的選項,但它們都返回結果找到了差異,即第一個數組。

我有不同的ID

+1

你試過['array_diff()'](http://us1.php.net/manual/en/function.array-diff.php)嗎? –

+0

@Shankar Damodaran是的,我有一個不同的ID –

+1

@archi_sova你想基於'NAME'而忽略'ID'嗎? – hsz

回答

4

只是嘗試:

$output = array_udiff($arraySecond, $arrayFirst, function($a, $b){ 
    return strcmp($a['NAME'], $b['NAME']);; 
}); 

輸出:

array(2) { 
    [0] => 
    array(3) { 
    'ID' => 
    int(543547564) 
    'NAME' => 
    string(6) "Name_1" 
    'PREVIEW_TEXT' => 
    string(6) "Text_1" 
    } 
    [2] => 
    array(3) { 
    'ID' => 
    int(333876833) 
    'NAME' => 
    string(6) "Name_3" 
    'PREVIEW_TEXT' => 
    string(6) "Text_3" 
    } 
} 
+0

非常感謝!它的工作) –

+0

@archi_sova不客氣。 – hsz

2

如果兩個數組很大,array_diff將是非常低效的,因爲它比較第一個陣列的每個元素與第二個元素的每個元素。更快的解決方案是將過程分成兩個步驟:首先,產生一組密鑰以除去:

$remove = array(); 
foreach($firstArray as $item) 
     $remove[$item['name']] = 1; 

然後遍歷所述第二陣列上,並添加「好」項的結果:

$result = array(); 
foreach($secondArray as $item) 
     if(!isset($remove[$item['name']])) 
      $result []= $item; 

這會給你線性的表現,而array_diff是二次的。

+0

這是一個很好的解決方案,值得注意! –

1

DIFF對字段(列)你想,回報只有那些條目,然後(感謝鑰匙)兩個數組:如果你喜歡這個少二次,但線性

$col = 'NAME'; 
$diff = array_intersect_key($b, array_diff(array_column($b, $col), array_column($a, $col))); 
print_r($diff); 

,你也可以通過迭代解決它(靈感來自georg's answer但再次使用array_column()):

$filtered = function ($col, $a, $b) { 
    return iterator_to_array(call_user_func(function() use ($col, $a, $b) { 
     $coled = array_flip(array_column($a, $col)); 
     foreach ($b as $bk => $bv) if (!isset($coled[$bv[$col]])) yield $bk => $bv; 
    })); 
}; 

print_r($filtered('NAME', $a, $b)); 

隨着$a$b概述的,你會得到以下結果爲兩個例子:

Array 
(
    [0] => Array 
     (
      [ID] => 543547564 
      [NAME] => Name_1 
      [PREVIEW_TEXT] => Text_1 
     ) 

    [2] => Array 
     (
      [ID] => 333876833 
      [NAME] => Name_3 
      [PREVIEW_TEXT] => Text_3 
     ) 

) 

// 1.) - diff against column, intersect keys 
$filtered = function($col, $a, $b) { 
    return array_intersect_key($b, array_diff(array_column($b, $col), array_column($a, $col))); 
}; 

// 2.) - iterate and take only unset by column 
$filtered = function ($col, $a, $b) { 
    return iterator_to_array(call_user_func(function() use ($col, $a, $b) { 
     $coled = array_flip(array_column($a, $col)); 
     foreach ($b as $bk => $bv) if (!isset($coled[$bv[$col]])) yield $bk => $bv; 
    })); 
}; 

// 3.) - array_udiff against column 
$filtered = function($col, $a, $b) { 
    return array_udiff($b, $a, function ($a, $b) use ($col) { 
     return strcmp($a[$col], $b[$col]); 
    }); 
}; 

用法:

print_r($filtered('NAME', $a, $b)); 

$a哪裏是包含元素從$b數組中刪除該陣列。所以$a是問題的第一個數組,$b是問題的第二個數組。

+0

使用匿名函數比較方便,因爲我有一個文件被訪問發生在您決定的幾次我必須爲這個文件創建函數。不過謝謝你,我仔細閱讀你的回覆,我喜歡它! –

相關問題