0

私は多くの配列を持っており、それぞれがのインスタンスを保持していますProduct。ユニークな製品のみを入手する必要があります。のPHPドキュメントからarray_diff

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

(string)$ elem1 ===(string)$ elem2の場合に限り、2つの要素は等しいと見なされます。つまり、文字列表現が同じ場合。

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ドキュメントマニュアルの型キャストセクションによると、関数は必要ありませんtoString()。基本的に型キャスト(文字列)は、単純に行った場合と同じです。var_dump($uniqueProducts)

array_diffが行っているのは、配列を型キャストすることだけです。

1つのオプションは、独自の「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 に答える