首页 > 解决方案 > 从数组php中删除自定义对象

问题描述

我有一张带礼品卡的桌子 1,2,3 .... 100 $ 礼品卡用户电话我要 123$

我根据他的要求告诉他,他必须使用哪张卡

我有这个数组

Array
(
[0] => Array
    (
        [Card_1] => 20 $
        [Card_2] => 50 $
    )

[1] => Array
    (
        [Card_1] => 50 $
        [Card_2] => 20 $
    )

[2] => Array
    (
        [Card_1] => 40 $
        [Card_2] => 50 $
    )

[3] => Array
    (
        [Card_1] => 50 $
        [Card_2] => 40 $
    )
)

我有这个功能

function DeleteDup ($allcard){
    foreach ($allcard as $key => $all) {
        for ($i = 0; $i < count ($allcard); $i++) {

            $new = array();
            $new["Card_1"] = $allcard[$i]["Card_2"];
            $new["Card_2"] = $all["Card_1"];

            if($new == $all){
                unset($allcard[$key]);
            }
        }
    }
    return $allcard;
}

我想保留这两个项目之一

[2] => Array
    (
        [Card_1] => 40 $
        [Card_2] => 50 $
    )

[3] => Array
    (
        [Card_1] => 50 $
        [Card_2] => 40 $
    )

并删除其中一个

请帮我

我测试了一切

这是两个不同的键,但在不同的位置相等

标签: phparrays

解决方案


如果您试图只保留一个值总和相同的条目,请尝试以下操作:

$sums   = array_map('array_sum', $allcard);
$uniq   = array_unique($sums);
$result = array_diff_key($allcard, $uniq);
  • 对每个数组中的数字求和
  • 仅获取唯一的总和值
  • 计算密钥的差异以仅获取唯一的密钥

单线:

$result = array_diff_key($allcard, array_unique(array_map('array_sum', $allcard)));

这将适用于数值或类似的数值50 $将被转换为正确的数值。它不适用于$50将被强制转换为0.


由于您可能拥有 ( 50and 40) 和 ( 60and 30) 的总和相同,因此这可能不是您想要的。这比较了实际值:

$sorted = array_map(function($v) { sort($v); return $v; }, $allcard);
$result = array_map('unserialize', array_unique(array_map('serialize', $sorted)));
  • 对每个子数组进行排序,使它们具有相同的序列化值
  • 将每个子数组序列化为字符串并获取唯一值
  • 反序列化每个子数组

单线:

$result  = array_map('unserialize', array_unique(array_map('serialize', array_map(
                     function($v) {
                         sort($v); return $v;
                     }, $allcard))));

推荐阅读