2014-02-18 41 views
0

我需要遍歷一堆數組,這些數組從我從mysql返回的包含大量重複條目的數組中創建一個數組。數組中將有一個或多個唯一值,所以我需要保留這些值,但是一些使用逗號或分號將它們連接在一起成爲一個字符串。到目前爲止,我對此沒有任何運氣。這裏是一個phpfiddle從多個數組中創建一個數組並連接特定鍵中的唯一值

我需要它來創建一個單一的陣列是這樣的:從一個數組

Array 
(
    [0] => Array 
     (
      [0] => test 
      [1] => test 
      [2] => test 
      [3] => one 
      [4] => two 
     ) 

    [1] => Array 
     (
      [0] => test1 
      [1] => test 
      [2] => test 
      [3] => three 
      [4] => four 
     ) 

    [2] => Array 
     (
      [0] => test2 
      [1] => test 
      [2] => test 
      [3] => five, seven 
      [4] => six, eight 
     ) 

    [3] => Array 
     (
      [0] => test3 
      [1] => test 
      [2] => test 
      [3] => nine 
      [4] => ten 
     ) 

) 

這樣

Array 
(
    [0] => Array 
     (
      [0] => test 
      [1] => test 
      [2] => test 
      [3] => one 
      [4] => two 
     ) 

    [1] => Array 
     (
      [0] => test1 
      [1] => test 
      [2] => test 
      [3] => three 
      [4] => four 
     ) 

    [2] => Array 
     (
      [0] => test2 
      [1] => test 
      [2] => test 
      [3] => five 
      [4] => six 
     ) 

    [3] => Array 
     (
      [0] => test2 
      [1] => test 
      [2] => test 
      [3] => seven 
      [4] => eight 
     ) 

    [4] => Array 
     (
      [0] => test3 
      [1] => test 
      [2] => test 
      [3] => nine 
      [4] => ten 
     ) 

) 

這是我想:

for($i=0; $i < count($arrayBIG); $i++) { 
    if($arrayBIG[$i][0] == $arrayBIG[$i+1][0]) { 
     $clean[$i] = array(array_unique(array_merge($arrayBIG[$i],$arrayBIG[$i+1]), SORT_REGULAR)); 
    } 
} 
+0

循環數據可能比嘗試使用'array_merge'更容易。 –

+0

SQL有更好的選項來過濾掉重複的數據。你不能只擴展SQL查詢嗎? – feeela

+0

我發佈了一個關於如何去做的問題,沒有人可以回答,有人說在應用程序級別更好地過濾它 – Yamaha32088

回答

1

好了,所以我會根據您的更新後一個新的答案。這一個比以前的版本有更多的工作,但這裏是簡要的說明:首先,我繞過大數組,並且對於每個第一個元素,我檢查它是否也出現在數組中。如果是這樣,我記下陣列中的每個位置,以便知道哪些元素要「合併」並稍後更新。

經過一些循環後,我們可以找到來自所有相似數組的數據的「列」,並使用array_unique將它們合併在一起,然後將它們分解爲一個字符串。

最後,重建陣列,取消原始項目並將我們的新改進陣列插入原始位置。

// DEFAULT ARRAY 
$arrayBIG = array(
    array('test', 'test', 'test', 'one', 'two'), 
    array('test1', 'test', 'test', 'three', 'four'), 
    array('test1', 'test', 'test', 'asdfasd', '443llpapos'), 
    array('test1', 'test', 'test', '94niwnoowi', 'inoinwoinw'), 
    array('test2', 'test', 'test', 'five', 'six'), 
    array('test2', 'test', 'test', 'seven', 'eight'), 
    array('test3', 'test', 'test', 'nine', 'ten') 
); 


// STORE THE ITEM OF EACH ARRAY INTO AN ARRAY OF ITS OWN SO WE CAN CHECK FOR DUPES 
foreach ($arrayBIG AS $item_array) { 
    $temp_array[] = $item_array[0]; 
} 

// COUNT THE VALUES OF THE ARRAY AND STORE ANY KEYS THAT APPEAR MORE THAN ONCE 
// THESE WILL BE THE ITEMS WE TRY AND MERGE 
// THIS WILL NOT BE THE NUMERIC KEY, BUT THE TEXT OF THE KEY - EX: 'test2' 
foreach(array_count_values($temp_array) AS $item_count_key => $item_count_val) { 
    if ($item_count_val > 1) { 
     $dupe_key_array[] = $item_count_key; 
    } 
} 


// LOOP THROUGH THE DUPE KEYS AND FIND THEIR POSITIONS, THEN MERGE THE SIMILAR ITEMS 
foreach ($dupe_key_array AS $dupe_key) { 

    $dupe_keys = array(); 
    $new_array = array(); 


    // FOR EACH MAIN ARRAY, NOTE THE ACTUAL NUMERIC LOCATION OF THE VALUE IN THE MAIN ARRAY 
    foreach ($arrayBIG AS $array_big_key => $array_big_val) { 

     // WHEN WE FIND A MATCH, ADD THE NUMERIC VALUE TO THE ARRAY 
     // THESE WILL BE THE ITEMS THAT WILL BE REPLACED IN THE FINAL ARRAY 
     if ($array_big_val[0] == $dupe_key) { 
      $dupe_keys[] = $array_big_key; 
      } 

    } 

    // FOR EACH ITEM, PULL OUT THE "COLUMN" AND MERGE THEM 
    for($i = 0; $i < count($array_big_val); $i++) { 

     $temp_array_1 = array(); 

     // FOR EACH DUPE, GET EACH INDIVIDUAL ITEM FROM EVERY POSITION AND PUT THEM INTO A TEMP ARRAY 
     // THIS WILL BE THE "COLUMN" FOR EACH ARRAY. 
     foreach ($dupe_keys AS $dupe_keys_val) { 
      $temp_array_1[] = $arrayBIG[$dupe_keys_val][$i]; 
     } 

     // FILTER OUT DUPES AND THEN IMPLODE IT INTO A COMMA-SEPARATED STRING 
     $new_array[] = implode(', ', array_unique($temp_array_1)); 

    } 

    // UNSET ALL OF THE ITEMS THAT WE ARE GOING TO BE REPLACING    
    foreach ($dupe_keys AS $array_item_to_remove) { 
     unset ($arrayBIG[$array_item_to_remove]); 
    } 


    // FIND THE FIRST ITEM IN THE ARRAY WE ARE GOING TO REPLACE 
    // WE WILL INSERT THE NEW ARRAY AT THIS LOCATION 
    $first_array_item_to_replace = array_shift($dupe_keys); 

    // SPLICE THE MAIN ARRAY AND ADD IN OUR NEW MERGED ARRAY AT THE FIRST POSITION 
    array_splice($arrayBIG, $first_array_item_to_replace, 0, array($first_array_item_to_replace => $new_array)); 



} 
1

我循環使用了初始代碼,並能夠將變量重新分配到臨時排列中年。我從$ arrayBIG的每個元素拉出相同的項目:

$arrayBIG[0][1] 
$arrayBIG[1][1] 
$arrayBIG[2][1] ... 

然後,我對這些陣列做了一個array unique和內爆它們放入一個字符串。最後,我將該字符串添加到最終的輸出數組中。看起來你已經在帖子中更改了問題的代碼,但是這些概念仍然應該是相同的。

$arrayBIG = array(0 => array("test", "test", "test", "one", "two"), 
        1 => array("test", "test", "test", "three", "four"), 
        2 => array("test", "test", "test", "five", "six")); 

$new_array = array(); 

for ($j = 0; $j < count($arrayBIG[0]); $j++) { 

    $temp_array = array(); 

    for ($i = 0; $i < count($arrayBIG); $i++) { 
     $temp_array[] = $arrayBIG[$i][$j]; 
    } 

    $new_array[] = implode(', ', array_unique($temp_array)); 
} 

該代碼將有$new_array輸出這樣的:

Array 
(
    [0] => test 
    [1] => test 
    [2] => test 
    [3] => one, three, five 
    [4] => two, four, six 
) 
相關問題