13

我有以下变量 $rows:

大批 (

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

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

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

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

)

我需要创建第二个数组 $second 仅包含唯一值:

大批 (

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

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

)

但是当我在 $rows 上运行 array_unique 时,我收到:

可捕获的致命错误:类 stdClass 的对象无法在第191行转换为字符串

4

4 回答 4

25

array_unique()

可选的第二个参数 sort_flags 可用于使用这些值修改排序行为:

排序类型标志:

  • SORT_REGULAR - 正常比较项目(不要更改类型)
  • SORT_NUMERIC - 以数字方式比较项目
  • SORT_STRING - 将项目作为字符串进行比较
  • SORT_LOCALE_STRING - 根据当前语言环境将项目作为字符串进行比较。

还要注意下面的变更说明

5.2.10 将 sort_flags 的默认值改回 SORT_STRING。

5.2.9 添加了默认为 SORT_REGULAR 的可选 sort_flags。在 5.2.9 之前,此函数用于在内部使用 SORT_STRING 对数组进行排序。

$values = array_unique($values, SORT_REGULAR);
于 2012-07-05T08:26:42.223 回答
10
$uniques = array();
foreach ($array as $obj) {
    $uniques[$obj->product_sku] = $obj;
}

var_dump($uniques);
于 2012-07-05T08:25:32.540 回答
5

函数的默认行为array_unique()是首先将内部的值视为字符串。所以发生的事情是 PHP 试图将您的对象转换为字符串(这会引发错误)。

您可以像这样修改函数调用:

$uniqueArray = array_unique($rows, SORT_REGULAR);

这将在不更改其数据类型的情况下比较值。

于 2012-07-05T08:27:06.477 回答
0

请检查以下代码,希望这对您有所帮助。

$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;
}
于 2015-07-10T06:50:35.847 回答