我有很多数组,每个数组都包含Product
的实例。只需要获得独特的产品。来自array_diff
的PHP文档:
array array_diff ( array $array1 , array $array2 [, array $... ] )
当且仅当(字符串)$ elem1 ===时,才认为两个元素相等 (字符串)$ 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;
答案 0 :(得分:1)
这是否意味着我被迫在我的实例中实现toString()?
根据PHP文档手册中的typecast section - 您不需要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;
}
答案 1 :(得分: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.