2012-11-16 31 views
1

所以我有點卡在這裏,我可以用foreach循環來做,但我想找到一個更聰明的方式來做到這一點。PHP:相交兩個數組並獲得這兩個值

更新:有些事我在問題中已經錯過了。這些陣列可能隨機排列,長度不同,因此具有不同的鍵。以下示例已更新。

這裏是的情況下:

數組1

array (
    slug1 => England, 
    slug2 => France, 
    slug3 => Italy, 
    slug4 => Germany, 
) 

ARRAY2

array (
    slug2 => 215, 
    slug1 => 168, 
    slug4 => 55, 
    slug5 => 149, 
    slug3 => 40, 
    slug6 => 137, 
) 

欲相交這些陣列和建立新的一個,其具有以下要素:

array (
    168 => England, 
    215 => France, 
    40 => Italy, 
    55 => Germany, 
) 

注:元素雖然可以輕鬆實現,但沒有排序。

回答

2

回答到原來的問題

可以使用array_combine它通過使用密鑰一個陣列,另一個用於其值

$array1 = array(
     "slug1" => "England", 
     "slug2" => "France", 
     "slug3" => "Italy", 
     "slug4" => "Germany"); 

$array2 = array(
     "slug1" => "168", 
     "slug2" => "215", 
     "slug3" => "40", 
     "slug4" => "55"); 

$final = array_combine($array2, $array1); 

echo "<pre>"; 
print_r($final); 

輸出

Array 
(
    [168] => England 
    [215] => France 
    [40] => Italy 
    [55] => Germany 
) 

See Live Demo

創建一個數組

答到更新的問題

Update: There was something that I've missed in the question. The arrays may come in random order and in different length thus having different keys. Examples below updated.

$array1 = array(
     "slug1" => "England", 
     "slug2" => "France", 
     "slug3" => "Italy", 
     "slug4" => "Germany"); 

$array2 = array (
     "slug2" => 215, 
     "slug1" => 168, 
     "slug4" => 55, 
     "slug5" => 149, 
     "slug3" => 40, 
     "slug6" => 137); 



$final = customCombine($array2, $array1); 

echo "<pre>"; 
print_r($final); 

輸出

Array 
(
    [215] => France 
    [168] => England 
    [55] => Germany 
    [40] => Italy 
) 

功能用於

function customCombine($keys, $arr) { 
    $t = array(); 
    foreach ($keys as $k => $val) { 
     isset($arr[$k]) and $t[$val] = $arr[$k]; 
    } 
    return $t; 
} 
+1

另外一個'ksort()'上兩個陣列可能需要如果鍵的順序不能保證是相同的。 –

+0

@傑克你是對的...... – Baba

+0

確定,看起來非常好,但如果陣列有不同的長度,這將無法正常工作,我知道這並沒有提到,但這是一個很好的例子 – infinity

0

使用array_combine()

<?php 
$a = array('green', 'red', 'yellow'); 
$b = array('avocado', 'apple', 'banana'); 
$c = array_combine($a, $b); 

print_r($c); 
?> 

http://in1.php.net/array-combine

2

巴巴的答案應該可以正常工作了你,但這裏同時處理陣列和/或不同尺寸之間不同的密鑰訂單一種有趣的方式。

// get values from $array2 in the order in which they appear in $array1 
// whereby the array keys are used to match them 
$keys = array_intersect_key($array2, $array1); 
// create a new array with the keys found in the previous step and 
// another array_intersect_key() to only select the matching items 
// from $array1 
array_combine($keys, array_intersect_key($array1, $keys)); 

它還確保array_combine()適用於相同大小的陣列; $array2的大小是輸出大小。

+1

尼斯但'array_slice'會使它失敗..例如http://eval.in/3583它返回'[215] =>英格蘭,[55] =>法國'而不是'[55] =>德國',[215] ] => France' – Baba

+0

我想我需要在這之前對兩個數組進行排序,否則它會得到錯誤的鍵/值,因爲@Baba指出 – infinity

+0

'ksort'不起作用..請參閱http:// eval。 in/3583使用kso​​rt已經是主要問題了'array_slice'我會用正確的實現更新他的問題 – Baba

0

我發現對我來說最好的解決辦法:

http://eval.in/3578

<?php 

$array1 = array("slug1" => "England","slug2" => "France","slug3" => "Italy","slug4" => "Germany"); 
$array2 = array("slug1" => "168","slug2" => "215","slug3" => "40","slug4" => "55", "slug5" => "178"); 

ksort($array1); 
ksort($array2); 

$test1 = array_intersect_key($array1, $array2); 
$test2 = array_intersect_key($array2, $array1); 

$final = array_combine($test2, $test1); 
print_r($final); 
?> 
+1

應該沒有什麼不同我的答案。順便說一句,雙ksort()在這裏並不是真的需要。 –

1

擴大Jack的答案,因爲它可能會結合他們正在建造中的順序排列,而不是訂單密鑰匹配:

Array 
(
    [215] => England 
    [168] => France 
    [55] => Italy 
    [40] => Germany 
) 

一些中間數據雜耍可以排序出來(和它無論哪個數組較短作品):

$array1 = array(
    'slug1' => 'England', 
    'slug2' => 'France', 
    'slug3' => 'Italy', 
    'slug4' => 'Germany' 
); 

$array2 = array (
    'slug2' => 215, 
    'slug1' => 168, 
    'slug4' => 55, 
    'slug5' => 149, 
    'slug3' => 40, 
    'slug6' => 137 
); 

$keys = array_intersect_key($array2, $array1); 
ksort($keys); 
$intersect = array_intersect_key($array1, $keys); 
ksort($intersect); 
$final = array_combine($keys, $intersect); 

print_r($final); 

輸出

Array 
(
    [168] => England 
    [215] => France 
    [40] => Italy 
    [55] => Germany 
)