2016-02-05 36 views
0

我有2個陣列,我需要組合成1個陣列。將多維陣列與條件相結合的另一個陣列

$ languages數組應該爲每個[語言]數組保存一行[line],並且只保存它自己匹配的[language]值。

第一陣列:

$languages = Array (
        [english] => Array() 
        [germany] => Array() 
        [russia] => Array() 
      ); 

二陣:

$data = Array (
       [line0] => Some text 
       [english0] => English text 
       [germany0] => Dutch text 
       [russia0] => Russian text 

       [line1] => Some more text 
       [english1] => English some more text 
       [germany1] => Dutch some more text 
       [russia1] => Russian some more text 

       ....... 
       (key's increment by 1) 
     ); 

經組合的陣列應該是什麼樣子:

$languages = Array (
       [english] = Array (
           [line0] => Some text 
           [english0] => English text 

           [line1] => Some more text 
           [english1] => English some more text 

           ........ 
           (key's increment by 1) 
         ) 
       [germany] = Array (
           [line0] => Some text 
           [germany0] => Dutch text 

           [line1] => Some more text 
           [germany1] => Dutch some more text 

           ...... 
           (key's increment by 1) 
         ) 
       [russia] = Array (
           [line0] => Some text 
           [russia0] => Russian text 

           [line1] => Some more text 
           [russia1] => Russian some more text 

           ........ 
           (key's increment by 1) 
         ) 
      ); 
+0

那麼你爲了得到這種結構試過嗎? – RiggsFolly

+2

您將從一些結構錯誤的數據開始,即第二個數組,並且您希望在結果數組中保留該錯誤結構。再想想你是如何創建第二個數組 – RiggsFolly

回答

4

參考,下面爲你想要的結果的解決方案:

$languages = Array(
    'english' => Array(), 
    'germany' => Array(), 
    'russia' => Array() 
); 

$data = Array(
    'line0' => 'Some test', 
    'english0' => 'English test', 
    'germany0' => 'Dutch test', 
    'russia0' => 'Russian test', 

    'line1' => 'Some more test', 
    'english1' => 'English some more test', 
    'germany1' => 'Dutch some more test', 
    'russia1' => 'Russian some more test', 

); 

$new_array = array(); 
foreach ($languages as $k => $v) { 
    foreach ($data as $key => $value) { 
     if (strpos($key, 'line') !== false || strpos($key, $k) !== false) 
      $new_array[$k][$key] = $value; 
    } 
} 

print_r($new_array); 

輸出:

Array 
(
    [english] => Array 
     (
      [line0] => Some test 
      [english0] => English test 
      [line1] => Some more test 
      [english1] => English some more test 
     ) 

    [germany] => Array 
     (
      [line0] => Some test 
      [germany0] => Dutch test 
      [line1] => Some more test 
      [germany1] => Dutch some more test 
     ) 

    [russia] => Array 
     (
      [line0] => Some test 
      [russia0] => Russian test 
      [line1] => Some more test 
      [russia1] => Russian some more test 
     ) 

) 

但隨着commen建議你應該創造更好的格式。例如參見下面的例子:

$new_array = array(); 
foreach ($languages as $k => $v) { 
    foreach ($data as $key => $value) { 
     $textarr = str_split($key, strlen($key) - 1); 
//  print_r($textarr); 
     if (strpos($key, 'line') !== false || strpos($key, $k) !== false) 
     $new_array[$k][$textarr[0]][$textarr[1]] = $value; 

    } 
} 

print_r($new_array); 

輸出:

Array 
(
    [english] => Array 
     (
      [line] => Array 
       (
        [0] => Some test 
        [1] => Some more test 
       ) 

      [english] => Array 
       (
        [0] => English test 
        [1] => English some more test 
       ) 

     ) 

    [germany] => Array 
     (
      [line] => Array 
       (
        [0] => Some test 
        [1] => Some more test 
       ) 

      [germany] => Array 
       (
        [0] => Dutch test 
        [1] => Dutch some more test 
       ) 

     ) 

    [russia] => Array 
     (
      [line] => Array 
       (
        [0] => Some test 
        [1] => Some more test 
       ) 

      [russia] => Array 
       (
        [0] => Russian test 
        [1] => Russian some more test 
       ) 

     ) 

) 

希望這將幫助你。

+1

這將是更快,更清晰的方式來獲得輸出作爲比較我的代碼:)好邏輯@Chetan Ameta –

+0

@AlankarMore謝謝:) –

+1

這確實幫了我。謝謝 ! – vill3

0

假設:(鍵的增量由1) $data數組。如果沒有這個代碼會給出未定義索引的錯誤。

$languageReference:用作$languages參考,因爲我不希望保存的結果相同的數組,但如果你願意,你可以。

$reference:在$data陣列end()功能的節能基準將移動內部指針,以結束陣列的所以不想處理原始數組。

$languageReference = $languages; 
$reference = $data; 
end($reference); 
$lastKey = key($reference); 
$count = (int) $lastKey[strlen($lastKey) - 1]; 
foreach ($languageReference as $lang => $langData) { 
    for ($index = 0; $index <= $count; $index++) { 
     $languageReference[$lang]['line' . $index] = $data['line' . $count]; 
     $languageReference[$lang][$lang . $index] = $data[$lang . $count]; 
    } 
} 

echo "<pre>"; 
var_dump($languageReference); 

輸出:

array(3) { 
    ["english"]=> 
    array(4) { 
    ["line0"]=> 
    string(14) "Some more text" 
    ["english0"]=> 
    string(22) "English some more text" 
    ["line1"]=> 
    string(14) "Some more text" 
    ["english1"]=> 
    string(22) "English some more text" 
    } 
    ["germany"]=> 
    array(4) { 
    ["line0"]=> 
    string(14) "Some more text" 
    ["germany0"]=> 
    string(20) "Dutch some more text" 
    ["line1"]=> 
    string(14) "Some more text" 
    ["germany1"]=> 
    string(20) "Dutch some more text" 
    } 
    ["russia"]=> 
    array(4) { 
    ["line0"]=> 
    string(14) "Some more text" 
    ["russia0"]=> 
    string(22) "Russian some more text" 
    ["line1"]=> 
    string(14) "Some more text" 
    ["russia1"]=> 
    string(22) "Russian some more text" 
    } 
} 
1

只是爲了嘗試。 對於正確的方法看扯談的答案

$newArray = array(); 
$finalArray = array(); 

$thirdArray = array('line','english','germany','russia'); // for formatting 2nd array 

//$data is secondArray 

$countData = count($data); 
for($i=0;$i<$countData/4;$i++) 
{ 
    foreach ($thirdArray as $key => $value) { 
     $newArray[$i][$value.$i] =$data[$value.$i]; //formatting array 
     } 
} 

foreach($newArray as $key=>$val) 
{ 
    foreach($languages as $k=>$v){ 
      $finalArray[$k][line.$key] = $newArray[$key][line.$key]; 
      $finalArray[$k][$k.$key] = $newArray[$key][$k.$key]; 
    } 

} 


print_r($finalArray); // outputs desired results