2012-07-05 46 views
12

Tôi có $ hàng biến sau đây:Chọn giá trị mảng chỉ độc đáo từ mảng này

Mảng (

[0] => stdClass Object 
    (
     [product_sku] => PCH20 
    ) 

[1] => stdClass Object 
    (
     [product_sku] => PCH20 
    ) 

[2] => stdClass Object 
    (
     [product_sku] => PCH19 
    ) 

[3] => stdClass Object 
    (
     [product_sku] => PCH19 
    ) 

)

tôi cần phải tạo ra mảng thứ hai $ thứ hai chứa chỉ các giá trị duy nhất:

Mảng (

[0] => stdClass Object 
    (
     [product_sku] => PCH20 
    ) 

[1] => stdClass Object 
    (
     [product_sku] => PCH19 
    ) 

)

Nhưng khi tôi chạy array_unique trên $ hàng, tôi nhận được:

catchable lỗi nghiêm trọng: đối tượng của lớp stdClass không thể chuyển đổi thành chuỗi trên dòng

+3

Theo mặc định, PHP sẽ cố gắng chuyển đổi giá trị thành chuỗi để so sánh. Thử chỉ định "mặc định": '$ result = array_unique ($ array, SORT_REGULAR);' –

Trả lời

10
$uniques = array(); 
foreach ($array as $obj) { 
    $uniques[$obj->product_sku] = $obj; 
} 

var_dump($uniques); 
24

array_unique()

Các tùy chọn sort_flags tham số thứ hai có thể được sử dụng để sửa đổi hành vi sắp xếp sử dụng các giá trị:

Sorting loại cờ:

  • SORT_REGULAR - so sánh các mặt hàng thông thường (không thay đổi các loại)
  • SORT_NUMERIC - so sánh các mục nu về mặt kinh tế
  • SORT_STRING - so sánh các mục dưới dạng chuỗi
  • SORT_LOCALE_STRING - so sánh các mục dưới dạng chuỗi dựa trên ngôn ngữ hiện tại.

Cũng lưu ý các changenotes dưới

5.2.10 Thay đổi giá trị mặc định của sort_flags trở lại SORT_STRING.

5.2.9 Đã thêm tùy chọn sort_flags làm mặc định thành SORT_REGULAR. Trước 5.2.9, hàm này được sử dụng để sắp xếp mảng với SORT_STRING bên trong.

$values = array_unique($values, SORT_REGULAR); 
+4

Câu trả lời này phải được chấp nhận. –

+0

Nó không phải là câu trả lời được chấp nhận. Câu hỏi đặt ra là 'Nhưng khi tôi chạy mảng_unique trên hàng $, tôi nhận được:' câu hỏi này không giải quyết. – Whitecat

+0

@Whitecat 'SORT_STRING' (mặc định) cố gắng truyền các giá trị vào chuỗi, trước khi so sánh các giá trị và đó là lỗi xuất phát từ đó. Xem https://3v4l.org/DeHIj Đó là những gì các trích dẫn thủ công cố gắng nói với bạn – KingCrunch

3

Hành vi mặc định chức năng array_unique() là để điều trị các giá trị bên trong như chuỗi đầu tiên. Vì vậy, những gì đang xảy ra là PHP đang cố gắng để biến các đối tượng của bạn thành chuỗi (mà là ném lỗi).

Bạn có thể thay đổi cuộc gọi chức năng của bạn như thế này:

$uniqueArray = array_unique($rows, SORT_REGULAR); 

này sẽ so sánh giá trị mà không thay đổi kiểu dữ liệu của họ.

+0

Rất đẹp: lấy bình luận của tôi và đăng nó như là câu trả lời của riêng bạn ... –

+0

Xin lỗi, tôi chỉ đang trong quá trình viết nó ...:/ – Stegrex

+4

chức năng này không hoạt động trong mảng đa chiều – mahen3d

0

Vui lòng kiểm tra mã bên dưới, tôi hy vọng điều này sẽ hữu ích cho bạn.

$resultArray = uniqueAssocArray($actualArray, 'product_sku'); 

function uniqueAssocArray($array, $uniqueKey) 
{ 
    if (!is_array($array)) 
    { 
    return array(); 
    } 
    $uniqueKeys = array(); 
    foreach ($array as $key => $item) 
    { 
    $groupBy=$item[$uniqueKey]; 
    if (isset($uniqueKeys[$groupBy])) 
    { 
     //compare $item with $uniqueKeys[$groupBy] and decide if you 
     //want to use the new item 
     $replace= false; 
    } 
    else 
    { 
     $replace=true; 
    } 
    if ($replace) 
     $uniqueKeys[$groupBy] = $item; 
} 
return $uniqueKeys; 
} 
Các vấn đề liên quan