2011-01-03 6 views
11

Tôi đã có một thiết lập mảng đa chiều như sau:Làm cách nào để tạo một mảng đa chiều duy nhất?

array(
    [0]=> 
    array(
    ["name"]=> "Foo" 
    ["slug"]=> "Bar" 
) 
    [1]=> 
    array(
    ["name"]=> "Foo" 
    ["slug"]=> "Bar" 
) 
    [2]=> 
    array(
    ["name"]=> "Test 1" 
    ["slug"]=> "test-1" 
) 
    [3]=> 
    array(
    ["name"]=> "Test 2" 
    ["slug"]=> "test-2" 
) 
    [4]=> 
    array(
    ["name"]=> "Test 3" 
    ["slug"]=> "test-3" 
) 
) 

Điều gì sẽ là cách tốt nhất để tìm kiếm thông qua khu vực này cho các giá trị nhân bản trong "Tên" và loại bỏ chúng, do đó mỗi giá trị trong đa chiều mảng là duy nhất?

Cảm ơn trước!

+0

Giả sử bạn có một 'tên' trùng lặp nhưng giá trị 'slug' thay đổi - bạn dự đoán kết quả là gì? (Bản sao nào cần được xóa/xóa?) –

+0

@Brad Christie, trong trường hợp cụ thể này tên/kết hợp slug sẽ không thay đổi. Cám ơn bạn đã góp ý! :) – hsatterwhite

Trả lời

8

Kể từ khi tất cả mọi người được lựa chọn thay thế, đây là một giải pháp cho các vấn đề ở tay. Đôi khi chúng tôi phải làm việc với dữ liệu chúng tôi có, không phải sắp xếp lại theo cách chúng tôi thích. Điều đó đang được nói, điều này sẽ loại bỏ tất cả các mục phụ liên tiếp từ mảng được trùng lặp.

$array = Array(
    Array(
    'name' => 'Test 3', 
    'slug' => 'test-3' 
), 
    Array(
    'name' => 'Foo', 
    'slug' => 'Bar' 
), 
    Array(
    'name' => 'Foo', 
    'slug' => 'Bar' 
), 
    Array(
    'name' => 'Test 1', 
    'slug' => 'test-1' 
), 
    Array(
    'name' => 'Test 2', 
    'slug' => 'test-2' 
), 
    Array(
    'name' => 'Test 3', 
    'slug' => 'test-3' 
), 
); 
var_dump($array); 

for ($e = 0; $e < count($array); $e++) 
{ 
    $duplicate = null; 
    for ($ee = $e+1; $ee < count($array); $ee++) 
    { 
    if (strcmp($array[$ee]['name'],$array[$e]['name']) === 0) 
    { 
     $duplicate = $ee; 
     break; 
    } 
    } 
    if (!is_null($duplicate)) 
    array_splice($array,$duplicate,1); 
} 
var_dump($array); 

Mà sẽ trông như thế này:

array(6) { 
    [0]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 3" 
    ["slug"]=> 
    string(6) "test-3" 
    } 
    [1]=> 
    array(2) { 
    ["name"]=> 
    string(3) "Foo" 
    ["slug"]=> 
    string(3) "Bar" 
    } 
    [2]=> 
    array(2) { 
    ["name"]=> 
    string(3) "Foo" 
    ["slug"]=> 
    string(3) "Bar" 
    } 
    [3]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 1" 
    ["slug"]=> 
    string(6) "test-1" 
    } 
    [4]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 2" 
    ["slug"]=> 
    string(6) "test-2" 
    } 
    [5]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 3" 
    ["slug"]=> 
    string(6) "test-3" 
    } 
} 
array(4) { 
    [0]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 3" 
    ["slug"]=> 
    string(6) "test-3" 
    } 
    [1]=> 
    array(2) { 
    ["name"]=> 
    string(3) "Foo" 
    ["slug"]=> 
    string(3) "Bar" 
    } 
    [2]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 1" 
    ["slug"]=> 
    string(6) "test-1" 
    } 
    [3]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 2" 
    ["slug"]=> 
    string(6) "test-2" 
    } 
} 
+1

Cảm ơn Brad giải pháp! Tôi thích quan điểm của bạn về việc chăm sóc vấn đề ở bàn tay và điều này làm việc cho tôi.Mặc dù tôi sẽ đưa gợi ý của @Gobs về việc tìm kiếm một bảng băm, vì tôi chưa bao giờ làm như vậy. Cơ hội tốt để học hỏi. :) – hsatterwhite

+0

Hey hãy thử em bé một lót này: '$ input = array_map ('unserialize', array_unique (mảng_map ('serialize', $ input))); ' https://stackoverflow.com/a/946300/3063226 – Heitor

0

Chỉ cần xem xét trường hợp cụ thể của bạn, tôi khuyên bạn nên sử dụng bảng băm thay vì mảng 2 chiều. Nếu bạn sử dụng "tên" của bạn làm khóa trong băm, mỗi mục sẽ là duy nhất.

Có nhu cầu cụ thể nào cho mảng đa chiều không?

+0

Không bao giờ được sử dụng một bảng băm, nhưng tôi chắc chắn sẽ xem xét nó như bạn đề nghị. Không có nhu cầu cụ thể cho mảng đa chiều, nó chỉ là cách tôi chuẩn bị dữ liệu tại thời điểm đó. Cảm ơn đề nghị và giúp đỡ của bạn. :) – hsatterwhite

24

Bạn có thể sử dụng mảng liên kết.

$temp_array = array(); 
foreach ($array as &$v) { 
    if (!isset($temp_array[$v['name']])) 
     $temp_array[$v['name']] =& $v; 
} 

Điều này tạo ra một mảng tạm thời, sử dụng $v['name'] làm khóa. Nếu đã có một phần tử có cùng khóa, nó không được thêm vào mảng tạm thời.

Bạn có thể chuyển đổi các mảng kết hợp trở lại một mảng liên tục, sử dụng

$array = array_values($temp_array); 

Ví dụ mã và đầu ra: http://codepad.org/zHfbtUrl

+1

Tôi thích điều này, đó là một phương tiện khá đơn giản và nhỏ gọn để thực hiện công việc. Cảm ơn sự giúp đỡ của bạn và cung cấp một liên kết đến một ví dụ làm việc! :) – hsatterwhite

5
$array = array(
    0 => array(
     "name"=> "Foo", 
     "slug"=> "Bar" 
    ), 
    1 => array(
     "name"=> "Foo", 
     "slug"=> "Bar" 
    ), 
    2 => array(
     "name"=> "Test 1", 
     "slug"=> "test-1" 
    ), 
    3 => array(
     "name"=> "Test 2", 
     "slug"=> "test-2" 
    ), 
    4 => array(
     "name"=> "Test 3", 
     "slug"=> "test-3" 
    ) 
); 



function array_unique_by_key (&$array, $key) { 
    $tmp = array(); 
    $result = array(); 
    foreach ($array as $value) { 
     if (!in_array($value[$key], $tmp)) { 
      array_push($tmp, $value[$key]); 
      array_push($result, $value); 
     } 
    } 
    return $array = $result; 
} 

array_unique_by_key($array, "name"); 
0
function multi_array_unique_by_value($array, $colon = '') 
{ 
    $ret_array = array(); 
    $has_array = array(); 
    foreach($array as $item) 
    { 
     $item_array = (array)$item; 
     if(!in_array($item_array[$colon], $has_array)) 
     { 
      array_push($ret_array, $item); 
      array_push($has_array, $item_array[$colon]); 
     } 
    } 
    return $ret_array; 
} 

Bạn có thể cung cấp cho mảng của bạn ở đây và đưa ra một tên thư đại tràng để làm độc đáo.

Trên mã này, bạn có mảng đa chiều, chúng tôi đã tìm kiếm mảng đó, chỉ mục cột nào cho chúng tôi, chúng tôi đẩy giá trị cột đó. Và khi cùng một giá trị, nó không thêm mảng trả về.

Vì vậy, giải pháp này cho array_unique cho 1 coloumn.

+0

Có thể giải thích rõ hơn về những gì đang xảy ra ở đây không? – Mike

0

Giải pháp đơn giản hơn nhiều cho mảng đa chiều của bạn.

$unique = array_map('unserialize', array_unique(array_map('serialize', $array))); 

echo "<pre>"; 
print_r($unique); 
+0

bạn cũng có thể sử dụng 'mảng_map (" json_decode ", array_unique (mảng_map (" json_encode ", $ final)))' nếu bạn đang lưu trữ dữ liệu trong cơ sở dữ liệu. – manish1706