带有实例或自定义回调函数的 PHP array_diff?

Posted

技术标签:

【中文标题】带有实例或自定义回调函数的 PHP array_diff?【英文标题】:PHP array_diff with instances or custom callback function? 【发布时间】:2012-11-11 11:23:04 【问题描述】:

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

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密码哈希(),默认或自定义盐? [复制]

[PHP警告:mail():“sendmail_from”未在php.ini中设置或自定义“From:”标头丢失

php回调函数的概念及实例

回调函数与PHP实例

带有 UIWebView 或自定义视图控制器的 iPad 应用程序

带有自定义 Grub 或自定义加载程序的多启动闪存驱动器(制作程序)