为了账号安全,请及时绑定邮箱和手机立即绑定

从数组php中删除自定义对象

从数组php中删除自定义对象

PHP
GCT1015 2022-07-16 11:18:59
我有一张带礼品卡的桌子 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 $    )并删除其中一个请帮我我测试了一切这是两个不同的键,但在不同的位置相等
查看完整描述

3 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

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


$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))));


查看完整回答
反对 回复 2022-07-16
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

最终代码是:


$sums = array_map ( 'array_sum' , $allcard );

$uniq = array_unique ( $sums );

$result = array_diff_key ( $allcard , $uniq );


foreach ($allcard as $key => $all) {

    if ($all["Card_1"] == $all["Card_2"]) {

        array_push ( $result , $all );

    }

}



查看完整回答
反对 回复 2022-07-16
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

看起来您正在尝试过滤掉不包含 40 或 50 作为其值的数组。


您可以使用array_filter来做到这一点:


此函数将数组作为第一个参数,将回调作为第二个参数。它将解析数组的每个元素,如果当前元素通过回调中的条件,它将被推入一个新数组,该数组将由函数返回。


$array = [...]

$filteredArray = array_filter($array, function($item) {

    // if the item passes this condition, it will in the filteredArray

    return in_array($item['Card_1'], ['40 $', '50 $']) && in_array($item['Card_2'], ['40 $', '50 $'])

});

在这里我使用该功能in_array,因为我不想进行 4 次检查。您可以随意更改条件,基本概念保持不变


PS此代码未经测试,请不要只是复制和粘贴它期望一切正常。尝试了解我所做的并将此概念应用于您的代码。


查看完整回答
反对 回复 2022-07-16
  • 3 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信