从此数组中仅选择唯一的数组值

时间:2012-07-05 08:23:07

标签: php arrays array-unique

我有以下变量$ 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 个答案:

答案 0 :(得分:24)

array_unique()

  

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

     

排序类型标志:

     
      
  • SORT_REGULAR - 正常比较项目(不要更改类型)
  •   
  • SORT_NUMERIC - 以数字方式比较项目
  •   
  • SORT_STRING - 将项目比较为字符串
  •   
  • SORT_LOCALE_STRING - 根据当前区域设置将项目比较为字符串。
  •   

另请注意下面的变更说明

  

5.2.10 将sort_flags的默认值更改回SORT_STRING。

     

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

$values = array_unique($values, SORT_REGULAR);

答案 1 :(得分:10)

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

var_dump($uniques);

答案 2 :(得分:5)

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

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

$uniqueArray = array_unique($rows, SORT_REGULAR);

这将比较值而不更改其数据类型。

答案 3 :(得分: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;
}