2016-02-05 63 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