2010-09-22 71 views
5

nói tôi bắt đầu với một mảng đơn giản (mà có thể là về mặt lý thuyết của bất kỳ chiều dài):Chia mảng vào cặp độc đáo

$ids = array(1,2,3,4); 

gì nó là giải pháp tốt nhất cho tách mảng này vào một mảng các cặp độc đáo như:

$pair[0] = array(1,2); 
$pair[1] = array(1,3); 
$pair[2] = array(1,4); 
$pair[3] = array(2,3); 
$pair[4] = array(2,4); 
$pair[5] = array(3,4); 

Trả lời

3

Giải pháp đơn giản nhất là sử dụng một vòng lặp lồng nhau và xây dựng kết hợp khi bạn đi, mặc dù lưu ý rằng sự phức tạp ở đây là O (n).

$ids = array(1,2,3,4,4); 
$combinations = array(); 

$ids = array_unique($ids); // remove duplicates 
$num_ids = count($ids); 

for ($i = 0; $i < $num_ids; $i++) 
{ 
    for ($j = $i+1; $j < $num_ids; $j++) 
    { 
    $combinations[] = array($ids[$i], $ids[$j]); 
    } 
} 

Xem nhóm này trong hành động ở http://www.ideone.com/9wzvP

+0

Bạn có thể thoát khỏi kiểm tra 'in_array' bằng cách thực hiện' array_unique' trên '$ ids'. nó lên bằng cách đếm '$ ids' như một điều kiện tiên quyết trước khi các vòng lặp (vì nó sẽ không thay đổi) .Tôi chỉ đề cập đến những điều này vì bạn đề cập đến sự phức tạp ... – ircmaxell

+0

@ircmaxell Đúng về việc đếm' $ ids' đầu tiên, mặc dù Tôi không nghĩ rằng bạn có thể sử dụng 'array_unique' trước thời hạn mặc dù ... nó phụ thuộc vào mục tiêu của OP. nghĩa là nếu' $ ids = array (1,2,3,3) ' , nên [3,3] là kết quả? –

+0

Tôi có thể xác nhận rằng 3,3 không nên là kết quả của – robjmills

1

cố định từ ban đầu gợi ý nhảy-the-gun của tôi về array_chunk()

Hãy thử điều này thay vì:

$ids = array(1, 2, 3, 4); 
$out = array(); 

while ($item = array_shift($ids)) { 
    foreach ($ids as $key=>$value) { 
     $out[] = array($item, $value); 
    } 
} 
+2

'array_chunk' sẽ không làm những gì OP muốn, hãy nhìn vào ví dụ đầu ra. OP muốn kết hợp. –

+0

Ah, ngớ ngẩn tôi. Tôi đã không đọc đầu ra thông qua đúng cách! –

1

Có lẽ không phải là giải pháp tốt nhất

$ids = array(1,2,3,4); 

$pairs = array(); 
foreach($ids as $key => $data){ 
    foreach($ids as $subkey => $subdata){ 
     if($subkey != $key){ 
      if(!in_array(array($subdata, $data) , $pairs)){ 
       $pairs[] = array($data, $subdata); 
      } 
     } 
    } 
} 

Dù sao nó hoạt động

1

giải pháp ngọt, Nev Stokes! Tôi đã thay đổi 'khi' tuyên bố để tránh lặp từ phá vỡ khi một trong các giá trị là 0:

$ids = array(0, 1, 2, 3, 4); 
$out = array(); 

while (!is_null($item = array_shift($ids)) ) { 
    foreach ($ids as $key=>$value) { 
     $out[] = array($item, $value); 
    } 

} 
0
$ids = array(1,2,3,4); 
$result=array(); 
foreach($ids as $value_1) 
{ 
    foreach($ids as $value_2) 
    { 
    if($value_1 !=$value_2) 
    { 
     $result[]=array($value_1,$value_2); 
    } 
    } 
} 
echo "<pre>"; 
print_r($result);