2013-02-25 40 views
0

另一個陣列選擇索引I有兩個陣列這樣基於在PHP

Array 
(
    [0] => 1 
    [1] => 3 
    [2] => 4 
    [3] => 5 
) 

Array 
(
    [0] => Array 
     (
      [1] => Test1 
      [2] => Location1 
      [3] => Email1 
      [4] => Name1 
      [5] => Address1 
      [6] => Age1 
      [7] => Gender1 
      [8] => Phone1 
      [9] => Website1 
      [10] => Cell1 
     ) 

    [1] => Array 
     (
      [1] => Test2 
      [2] => Location2 
      [3] => Email2 
      [4] => Name2 
      [5] => Address2 
      [6] => Age2 
      [7] => Gender2 
      [8] => Phone2 
      [9] => Website2 
      [10] => Cell2 
     ) 

    [2] => Array 
     (
      [1] => Test3 
      [2] => Location3 
      [3] => Email3 
      [4] => Name3 
      [5] => Address3 
      [6] => Age3 
      [7] => Gender3 
      [8] => Phone3 
      [9] => Website3 
      [10] => Cell3 
     ) 
) 

現在我有選擇從每個第二陣列1,3,4和5的索引值。我怎樣才能做到這一點沒有兩個循環。我知道我將不得不使用一個,但我不希望使用兩個循環

輸出所需

Array 
(
    [0] => Array 
     (
      [1] => Test1 
      [3] => Email1 
      [4] => Name1 
      [5] => Address1 

     ) 

    [1] => Array 
     (
      [1] => Test2 
      [3] => Email2 
      [4] => Name2 
      [5] => Address2 
     ) 

    [2] => Array 
     (
      [1] => Test3 
      [3] => Email3 
      [4] => Name3 
      [5] => Address3 
     ) 
) 
+0

沒有循環!我認爲這是不可能的:( – 2013-02-25 20:40:44

+1

爲什麼你不想使用多個循環? – 2013-02-25 20:40:44

+0

使用兩個循環很常見。我想知道是否有任何內置的函數或邏輯的PHP,以便我可以實現它 – 2013-02-25 20:42:18

回答

4

使用一個循環, array_fliparray_intersect_key,你可以做這樣的:

$array_one = array(1, 3, 4, 5); 

$array_two = array(
    array(1 => 'Test1', 'Location1', 'Email1', 'Name1', 'Address1', 'Age1', 'Gender1', 'Phone1', 'Website1', 'Cell1'), 
    array(1 => 'Test2', 'Location2', 'Email2', 'Name2', 'Address2', 'Age2', 'Gender2', 'Phone2', 'Website2', 'Cell2'), 
    array(1 => 'Test3', 'Location3', 'Email3', 'Name3', 'Address3', 'Age3', 'Gender3', 'Phone3', 'Website3', 'Cell3') 
); 

$array_one_flip = array_flip($array_one); 
foreach($array_two as $k => $v) { 
    $result[] = array_intersect_key($v, $array_one_flip); 
} 

print_r($result); 

其結果將是:

Array 
(
    [0] => Array 
     (
      [1] => Test1 
      [3] => Email1 
      [4] => Name1 
      [5] => Address1 
     ) 

    [1] => Array 
     (
      [1] => Test2 
      [3] => Email2 
      [4] => Name2 
      [5] => Address2 
     ) 

    [2] => Array 
     (
      [1] => Test3 
      [3] => Email3 
      [4] => Name3 
      [5] => Address3 
     ) 

) 
+1

'array_intersect_key'使用鍵值並且沒有達到OP的期望結果。 – Jon 2013-02-25 20:59:21

+0

是的,我已經測試它不按照我的要求工作,因爲你可以看到它總是選擇前4列 – 2013-02-25 21:00:30

+0

是的,我也忽略了這一點。我修改了我的答案來解決這個問題。 – 2013-02-25 21:05:09

1

只需使用一個array_map功能是這樣的:

$keys_to_keep = array(1, 3, 4, 5); 
$key_diff_array = array_fill_keys($keys_to_keep, 'not used'); 

$array; // your main array you want to filter assume value has been set elsewhere 

$filtered_array = array_map(function ($value) use $key_diff_array { 
    return array_intersect_key($value, $key_diff_array); 
}, $array); 
+0

我在array_map中看不到$ array? – 2013-02-25 21:04:17

2

您可以用array_intersect_key嘗試:

$keys = array_flip($keys_array); // flip the keys array for matching with array_intersect_key 
$result = array(); 
foreach ($content_array as $arr) 
{ 
    $result[] = array_intersect_key($arr, $keys); 
} 

Working example on codepad。用感謝@邁克爾·伊裏戈延在陣列...

+0

它沒有選擇所需的結果。請測試它 – 2013-02-25 21:02:36

+0

@raheel shan您是否翻轉了您的按鍵陣列? – jeroen 2013-02-25 21:03:22

+0

是的,我測試過 – 2013-02-25 21:04:55

0

一個循環:

<?php 
$selection = array(1, 3, 4, 5); 
for($i = 0; $i < count($array); $i++){ 

reset($selection); 
$first = current($selection); 
$newarray[$i][$first] = $array[$i][$first]; 

$next = next($selection); 
$newarray[$i][$next] = $array[$i][$next]; 

$next = next($selection); 
$newarray[$i][$next] = $array[$i][$next]; 

$next = next($selection); 
$newarray[$i][$next] = $array[$i][$next]; 
} 
echo '<pre>'; 
print_r($newarray); 
+0

非常低效的做法。 – 2013-02-25 21:10:00

+0

然而,我知道它的正確性...... – 2013-02-25 21:10:41

0

您也可能會發現這個備註array_flip有用。

確保$ array1具有可在翻轉時作爲數組鍵使用的值。

http://php.net/manual/en/language.types.array.php

密鑰可以是一個整數或字符串。該值可以是任何類型。

此外以下項石膏將發生:

含有有效整數字符串將被強制轉換爲整數類型。例如。鍵「8」實際上將被存儲在8以下。另一方面,「08」不會被轉換,因爲它不是有效的十進制整數。 浮點數也被轉換爲整數,這意味着小數部分將被截斷。例如。關鍵字8.7實際上將被存儲在8以下。 Bools也被轉換爲整數,也就是說,關鍵字true將被存儲在1以下,關鍵字false被置於0以下。 Null將被轉換爲空字符串,即鍵null將實際存儲在「」下。 數組和對象不能用作鍵。這樣做會導致警告:非法偏移類型。 如果數組聲明中的多個元素使用相同的密鑰,則只有最後一個元素將被使用,因爲所有其他元素都將被覆蓋。

http://www.php.net/manual/en/function.array-flip.php

array_flip()返回在翻轉順序的陣列,即,由反式鍵成爲由反式成爲鍵的值和值。

請注意,trans的值需要是有效的密鑰,即他們需要是整數或字符串。如果值的類型錯誤,則會發出警告,並且所涉及的鍵/值對不會包含在結果中。

如果某個值有多次出現,則最新的密鑰將用作其值,其他所有密鑰將丟失。