2011-06-21 29 views
8

Tôi có một mảng trong PHP trông như thế này:Mảng duy nhất của PHP theo giá trị?

[0]=> 
     array(2) { 
      ["name"]=> 
       string(9) "My_item" 
      ["url"]=> 
       string(24) "http://www.my-url.com/" 
     } 
    [1]=> 
    array(2) { 
     ["name"]=> 
      string(9) "My_item" 
     ["url"]=> 
      string(24) "http://www.my-url2.com/" 
    } 

Hai giá trị trong "tên" đều giống nhau ở hai mặt hàng này. Tôi muốn phân loại các bản sao như thế này.

Làm cách nào để tạo một mảng duy nhất bằng cách kiểm tra giá trị "tên"?

+0

[how-to-remove-trùng lặp-giá trị-từ-một-đa-chiều-mảng-in-php] (http://stackoverflow.com/ question/307674/how-to-remove-duplicate-values-from-a-đa chiều-array-in-php) –

+2

Bạn muốn kết thúc mảng nào? Với hai giá trị cho URL khác nhau, một trong số chúng có phải đi không? Nếu vậy, làm thế nào bạn sẽ xác định cái nào để mất? – Pavling

+1

http://stackoverflow.com/questions/6417352/php-de-duplicate-keys-in-different-objects-in-array Về các đối tượng, nhưng bên cạnh chính xác này – KingCrunch

Trả lời

15

cơ bản

foreach($your_array as $element) { 
    $hash = $element[field-that-should-be-unique]; 
    $unique_array[$hash] = $element; 
} 
+0

Tnx điều này đã giúp tôi ra – DownDown

+0

Đây là giải pháp độc đáo và tốt – divyenduz

11

serialization là rất hữu ích cho việc đơn giản hóa quá trình xây dựng sự độc đáo của một mảng thứ bậc. Sử dụng một lớp lót này để lấy một mảng chỉ chứa các phần tử duy nhất.

$unique = array_map("unserialize", array_unique(array_map("serialize", $input))); 
2

Vui lòng xem liên kết này hữu ích, sử dụng md5 băm để kiểm tra các bản sao:

http://www.phpdevblog.net/2009/01/using-array-unique-with-multidimensional-arrays.html

thoáng nhanh:

/** 
* Create Unique Arrays using an md5 hash 
* 
* @param array $array 
* @return array 
*/ 
function arrayUnique($array, $preserveKeys = false) 
{ 
    // Unique Array for return 
    $arrayRewrite = array(); 
    // Array with the md5 hashes 
    $arrayHashes = array(); 
    foreach($array as $key => $item) { 
     // Serialize the current element and create a md5 hash 
     $hash = md5(serialize($item)); 
     // If the md5 didn't come up yet, add the element to 
     // to arrayRewrite, otherwise drop it 
     if (!isset($arrayHashes[$hash])) { 
      // Save the current element hash 
      $arrayHashes[$hash] = $hash; 
      // Add element to the unique Array 
      if ($preserveKeys) { 
       $arrayRewrite[$key] = $item; 
      } else { 
       $arrayRewrite[] = $item; 
      } 
     } 
    } 
    return $arrayRewrite; 
} 

$uniqueArray = arrayUnique($array); 
var_dump($uniqueArray); 

Xem ví dụ làm việc ở đây: http://codepad.org/9nCJwsvg

+0

@Symcbean Điều này hoạt động ngay cả khi giá trị ở cấp độ 2 là duy nhất, không chỉ giá trị đầu tiên. Tại sao điều này không giải quyết được câu hỏi? Nó cung cấp cho bạn đầu ra, vui lòng xem ví dụ làm việc. –

-2

Gi ven rằng các phím trên mảng (0,1) dường như không đáng kể một giải pháp đơn giản sẽ là sử dụng giá trị của phần tử được tham chiếu bằng 'tên' làm khóa cho mảng ngoài:

["My_item"]=> 
    array(2) { 
     ["name"]=> 
      string(9) "My_item" 
     ["url"]=> 
      string(24) "http://www.my-url.com/" 
    } 

... và nếu chỉ có một giá trị khác với 'tên' thì tại sao lại bận tâm với một mảng lồng nhau?

["My_item"]=>"http://www.my-url.com/" 
0

Simple Giải pháp:

/** 
* @param $array 
* @param null $key 
* @return array 
*/ 
public static function unique($array,$key = null){ 
    if(null === $key){ 
     return array_unique($array); 
    } 
    $keys=[]; 
    $ret = []; 
    foreach($array as $elem){ 
     $arrayKey = (is_array($elem))?$elem[$key]:$elem->$key; 
     if(in_array($arrayKey,$keys)){ 
      continue; 
     } 
     $ret[] = $elem; 
     array_push($keys,$arrayKey); 
    } 
    return $ret; 
} 
Các vấn đề liên quan