带有实例或自定义回调函数的 PHP array_diff?
Posted
技术标签:
【中文标题】带有实例或自定义回调函数的 PHP array_diff?【英文标题】:PHP array_diff with instances or custom callback function? 【发布时间】:2012-11-11 11:23:04 【问题描述】:我有很多数组,每个数组都包含Product
的实例。只需要获得独特的产品。来自array_diff
的php文档:
array array_diff ( array $array1 , array $array2 [, array $... ] )
两个元素被认为相等当且仅当 (string) $elem1 === (字符串)$elem2。换句话说:当字符串表示相同时。
这是否意味着我不得不在我的实例中实现toString()
?是否有任何函数可以提供自定义回调来计算差异?
我没有测试过这段代码,但我猜它不会起作用,因为Product
中没有toString()
函数:
$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;
【问题讨论】:
【参考方案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;
【讨论】:
类型转换对对象安全吗?也就是说,两个相同的实例会给出相同的字符串表示? tbh - 我不确定 - 因此我包含了您自己的“my_array_diff()”,您可以自定义如何检查您的对象以查找特定的差异/相似性而无需类型转换 感谢您的回答,但我一直在寻找一种单行(优雅)的方式来进行此检查。 好吧 - 它是你的主要部分中的“单行”代码 - 然后将“my_array_diff()”放在其他地方(可能在包含文件或其他地方) 您唯一的其他选择是尝试这样的事情:***.com/questions/4347293/comparing-arrays-of-objects - 但也使用自定义代码【参考方案2】:如果产品列表很短,您可以根据您选择的值实施自己的检查吗?
$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.
【讨论】:
我当然可以,但我正在寻找一个优雅的解决方案。无论如何,谢谢。以上是关于带有实例或自定义回调函数的 PHP array_diff?的主要内容,如果未能解决你的问题,请参考以下文章
[PHP警告:mail():“sendmail_from”未在php.ini中设置或自定义“From:”标头丢失