0

我有很多数组,每个数组都包含Product. 只需要获得独特的产品。来自 PHP 文档array_diff

array array_diff ( array $array1 , array $array2 [, array $... ] )

当且仅当 (string) $elem1 === (string) $elem2 时,才认为两个元素相等。换句话说:当字符串表示相同时。

这是否意味着我被迫toString()在我的实例中实施?是否有任何函数可以计算提供自定义回调的差异?

我没有测试这段代码,但我猜它不会工作,因为没有toString()函数Product

$categories = array();
// ...

// Unique products from all categories, compared against ===
$uniqueProducts = array();

// Compute unique products
foreach($categories as $category) {
    $uniqueProducts += array_diff($category->getProducts(), $uniqueProducts)
}

return $uniqueProducts;
4

2 回答 2

1

这是否意味着我不得不在我的实例中实现 toString() ?

根据 PHP 文档手册中的typecast 部分- 您不需要toString()函数。基本上类型转换(字符串)就像你只是做了一样var_dump($uniqueProducts)

array_diff 所做的就是对数组进行类型转换。

一种选择是制作自己的“array_diff”函数

function my_array_diff($arraya, $arrayb)
{
    foreach ($arraya as $keya => $valuea)
    {
        // Put your own 'test' here - but for example this uses in_array()
        if (in_array($valuea, $arrayb))
        {
            unset($arraya[$keya]);
        }
    }
    return $arraya;
}
于 2012-11-11T11:29:55.313 回答
0

如果产品列表很短,您可以根据您选择的值实施您自己的检查吗?

$uniqueProducts = array();
foreach($productsOne as $productOne) {
  foreach($uniqueProducts as $alreadyListed) {
    if($productOne->getName() != $alreadyListes->getName()) { // You can customise this line to make more specific
      break;
    }
    $uniqueProducts = $productOne; // If product hasn't already been added to the array then it's unique.
  }
}
// Repeat foreaches for second product array, or combine them before teh foreach using $productOne = $productOne+$productTwo.
于 2012-11-11T11:29:42.833 回答