2012-11-06 67 views
0

我有一些將多維數組縮減爲正常數組的問題。在多維數組中創建唯一的值

我有一個輸入陣列是這樣的:

Array 
(
[0] => Array (
     [0] => 17 
     [1] => 99 
    ) 
[1] => Array (
     [0] => 17 
     [1] => 121 
    ) 
[2] => Array (
     [0] => 99 
     [1] => 77 
    ) 
[3] => Array (
     [0] => 45 
     [1] => 51 
    ) 
[4] => Array (
     [0] => 45 
     [1] => 131 
    ) 

所以我有與所述值一些重疊(例如17,99和17121) 現在我想有一個這樣的輸出多維數組:

Array 
(
[0] => Array (
     [0] => 17 
     [1] => 99 
     [2] => 121 
     [3] => 77 
    ) 
[2] => Array (
     [0] => 45 
     [1] => 51 
     [3] => 131 
    ) 

我想保存,哪些文章在我的數據庫中這種方式是相同的。輸出數組shpuld仍然是一個多維數組,但是第二級中的每個數字在數組中都應該是唯一的。

我試圖解決這個問題超過一個星期了,但我沒有得到它的工作。我知道它應該很容易......但無論如何 - 我不明白:d

這是我走到這一步:

$parity_sorted = array(); 
    foreach($arr as $key => $a){ 
     if(count($parity_sorted) > 0){ 
     foreach($parity_sorted as $key2 => $arr_new){ 
      if(in_array($a[0], $arr_new) || in_array($a[1], $arr_new)){ 
       if(!in_array($a[0], $arr_new)){array_push($parity_sorted[$key2], $a[0]);} 
       if(!in_array($a[1], $arr_new)){array_push($parity_sorted[$key2], $a[1]);} 
      } else { 
       array_push($parity_sorted, array($a[0],$a[1])); 
      } 
     } 
     } else { 
      array_push($parity_sorted, array($a[0],$a[1])); 
     } 

    } 

你有沒有可能已經解決的問題是這樣,還是有更更簡單的方法也許我只是覺得太複雜了(這不是我的第一次嘗試,但這個代碼是最後一次嘗試)

任何幫助,將不勝感激。非常感謝

+4

烏姆你們的榜樣 「減少」 陣也是多方面的。你能解釋更多關於減少是如何工作的嗎? – durron597

+0

從我所知道的情況來看,這只是一個'array_unique()',它帶有'array_chunk()'。 –

+0

@ durron597哦......你是對的。有一些問題找到一個好的英文線程名稱: - /任何建議? :D – KddC

回答

1

這是我的修改後的代碼給你的評論和它的演示如期工作。 (http://codepad.org/CiukXctS

<?php 

$tmp = array(); 
foreach($array as $value) 
{ 
    // just for claraty, let's set the variables 
    $val1 = $value[0]; 
    $val2 = $value[1]; 
    $found = false; 
    foreach($tmp as &$v) 
    { 
     // check all existing tmp for one that matches 
     if(in_array($val1, $v) OR in_array($val2, $v)) 
     { 
      // this one found a match, add and stop 
      $v[] = $val1; 
      $v[] = $val2; 
      // set the flag 
      $found = true; 
      break; 
     } 
    } 
    unset($v); 

    // check if this set was found 
    if(! $found) 
    { 
     // this variable is new, set both 
     $tmp[] = array(
       $val1, 
       $val2, 
       ); 
    } 
} 

// go trough it all again to ensure uniqueness 
$array = array(); 
foreach($tmp as $value) 
{ 
    $array[] = array_unique($value); // this will eliminate the duplicates from $val2 
} 

ORIGIN ANSWER

的問題是嚴重的問,但我會嘗試回答什麼,我相信這個問題是。

你想收集所有對中具有相同第一個值的數組對嗎?

$tmp = array(); 
for($array as $value) 
{ 
    // just for claraty, let's set the variables 
    $val1 = $value[0]; 
    $val2 = $value[1]; 

    if(isset($tmp[$val1])) // we already found it 
    { 
     $tmp[$val1][] = $val2; // only set the second one 
    } 
    else 
    { 
     // this variable is new, set both 
     $tmp[$val1] = array(
      $val1, 
      $val2, 
     ); 
    } 
} 
// go trough it all again to change the index to being 0-1-2-3-4.... 
$array = array(); 
foreach($tmp as $value) 
{ 
    $array[] = array_unique($value); // this will eliminate the duplicates from $val2 
} 
+0

其不僅第一個值數組(17,99)和數組(99,77)也應該聚集到數組(17,99,77)。如果其中一個對在其中一個數組中,就足夠了。對不起 - 有時很難用你的母語解釋:P – KddC

+0

我編輯它並給出了一個修改後的解決方案。我希望這有幫助。 – paquettg

+0

這有助於很多傢伙。工作得很好。在那些時刻我意識到,我仍然需要學習很多:)我會仔細看看它 – KddC

0

這是常見任務的解決方案。

$data = array(array(17,99), array(17,121), array(99,77), array(45,51), array(45,131)); 
$result = array(); 
foreach ($data as $innner_array) { 
    $intersect_array = array(); 
    foreach ($result as $key => $result_inner_array) { 
     $intersect_array = array_intersect($innner_array, $result_inner_array); 
    } 
    if (empty($intersect_array)) { 
     $result[] = $innner_array; 
    } else { 
     $result[$key] = array_unique(array_merge($innner_array,  $result_inner_array)); 
    } 

} 
var_dump($result); 
+0

第一次沒有工作,但我會仔細看看它。 – KddC

+0

http://codepad.org/lhVp0GcJ –

+0

http://codepad.org/OsbL0KBw – KddC

0

嘗試:

$arr = array(array(17,99), 
      array(17,121), 
      array(99,77), 
      array(45, 51), 
      array(45, 131) 
    ); 

foreach($arr as $v) 
    foreach($v as $m) 
    $new_arr[] = $m; 

    $array = array_chunk(array_unique($new_arr), 4); 
    var_dump($array); 

Demo 它採用array_uniquearray_chunk

輸出:

array(2) { [0]=>array(4) { [0]=> int(17) [1]=>int(99) 
      [2]=>int(121) [3]=> int(77) } 
      [1]=> array(3) { [0]=> int(45) [1]=>int(51) 
      [2]=>int(131) } 
      } 
+0

這實際上不會工作。它在給定的情況下工作,但僅僅因爲它是一種特殊情況。如果您更改$ arr的順序,它會給出錯誤的答案。 http://codepad.org/W5YEWYnf – paquettg

+0

嘿,不幸的是,這將只適用於這個例子,如果我是正確的。因爲縮小數組的大小是可變的,並不總是4.如果輸入的順序不同,這將不再工作。但是,謝謝 – KddC

+0

它在這種情況下給出了正確的結果,但這不是問題的正確答案。這個想法並不是要分成4個組,而是將具有共同價值的數組分組。 – iMoses

0

我想我明白你的問題。讓我有一個裂縫。

$firstElems = array(); 
$secondElems = array(); 
foreach ($arr as $v) { 
    $firstElems[ $v[0] ] = array($v[0]); 
} 
foreach ($arr as $v) { 
    $secondElems[ $v[1] ] = $v[0]; 
} 

foreach ($arr as $v) { 
    if (isset($secondElems[ $v[0] ])) { 
     array_push($firstElems[ $secondElems[ $v[0] ] ], $v[1]); 
    } 
    else { 
     array_push($firstElems[ $v[0] ], $v[1]); 
    } 
} 

foreach ($firstElems as $k => $v) { 
    if (isset($secondElems[ $k ])) { 
     unset($firstElems[ $k ]); 
    } 
} 

輸出:

Array 
(
    [17] => Array 
     (
      [0] => 17 
      [1] => 99 
      [2] => 121 
      [3] => 77 
     ) 

    [45] => Array 
     (
      [0] => 45 
      [1] => 51 
      [2] => 131 
     ) 

) 
0

(代碼示例:http://codepad.org/rJNNq5Vd

我真的相信我理解你,如果這是這裏的情況是,你在找什麼:

function arrangeArray($array) { 
    $newArray = array(array_shift($array)); 

    for ($x = 0; $x < count($newArray); $x++) { 
     if (!is_array($newArray[$x])) { 
      unset($newArray[$x]); 
      return $newArray; 
     } 
     for ($i = 0; $i < count($newArray[$x]); $i++) { 
      foreach ($array as $key => $inArray) { 
       if (in_array($newArray[$x][$i], $inArray)) { 
        $newArray[$x] = array_unique(array_merge($newArray[$x], $inArray)); 
        unset($array[$key]); 
       } 
      } 
     } 
     $newArray[] = array_shift($array); 
    } 
} 

將返回:

array(2) { 
    [0]=> 
    array(4) { 
    [0]=> 
    int(17) 
    [1]=> 
    int(99) 
    [2]=> 
    int(121) 
    [4]=> 
    int(77) 
    } 
    [1]=> 
    array(3) { 
    [0]=> 
    int(45) 
    [1]=> 
    int(51) 
    [3]=> 
    int(131) 
    } 
} 

爲:

var_dump(arrangeArray(array(
    array(17,99), 
    array(17,121), 
    array(99,77), 
    array(45, 51), 
    array(45, 131), 
))); 

和:

array(1) { 
    [0]=> 
    array(6) { 
    [0]=> 
    int(17) 
    [1]=> 
    int(99) 
    [2]=> 
    int(121) 
    [3]=> 
    int(45) 
    [4]=> 
    int(77) 
    [6]=> 
    int(51) 
    } 
} 

爲:

var_dump(arrangeArray(array(
    array(17,99), 
    array(17,121), 
    array(99,77), 
    array(45, 51), 
    array(45, 17), 
)));