【问题标题】:Unset array by key and value using PHP使用 PHP 按键和值取消设置数组
【发布时间】:2019-07-17 19:53:16
【问题描述】:

我的数组是 $arrIncome 和 $arrExpense。他们有一些相同的日期和一些不同的日期。

$arrIncome = [
   [
     'date' => '01-01-2019',
     'total' => '500',
   ],
   [
     'date' => '02-01-2019',
     'total' => '200',
   ],
   [
     'date' => '03-01-2019',
     'total' => '300',
   ],
   [
     'date' => '04-01-2019',
     'total' => '900',
   ],
];

$arrExpense= [
   [
     'date' => '01-01-2019',
     'total' => '50',
   ],
   [
     'date' => '02-01-2019',
     'total' => '60',
   ],
   [
     'date' => '07-01-2019',
     'total' => '25',
   ],
   [
     'date' => '08-01-2019',
     'total' => '50',
   ],
];

我在 $arrIncome 数组中循环,如果我发现 $arrExpense 数组中有收入日期,我将按 $arrIncome 的收入日期删除 $arrExpense 中的一个数组,因为我想制作唯一的日期。

foreach ($arrIncome as $income){
        $isExistExpense = array_filter($arrExpense, function($expense) use($income){
            return $expense->date == date('Y-m-d', strtotime($income->date));
        });


        if(count($isExistExpense) > 0 ){
            foreach ($isExistExpense as $expense){
                // THIS PLACE TO UNSET $arrExpense by date value
                unset($arrExpense['date'] = $income->date); // this is a wrong way
            }
        }else{
            // my code more here.....
        }
    }

【问题讨论】:

标签: php arrays date unset


【解决方案1】:

您必须通过索引取消设置。

你可以这样做:

// Get the intersection of the dates 
$isExistExpense = array_intersect(
    array_column($arrIncome,'date'), 
    array_column($arrExpense,'date'));
// Loop through the `$arrExpense` and unset the that exist in the array. 
foreach($arrExpense as $index=>$vals){
    if(in_array($vals['date'], $isExistExpense)){
        unset($arrExpense[$index]);
    }
}

希望对你有帮助,

【讨论】:

  • 这很奇怪。你有一个错字($v 应该是 $vals)但代码仍然有效......
  • 已更新。这很奇怪。
  • 其实我错了,代码不能与$v一起工作,只是我在$arrExpense的预过滤版本上测试它,所以它实际上并没有做任何事情( $isExistExpense 为空)。
【解决方案2】:

您可以使用array_filter 直接删除$arrExpense 中日期存在于$arrIncome 中的元素(使用array_column 获取该数组中的日期列表):

$arrExpense = array_filter($arrExpense, function ($v) use ($arrIncome) { 
    return !in_array($v['date'], array_column($arrIncome, 'date'));
});
print_r($arrExpense);

输出:

Array (
   [2] => Array ( [date] => 07-01-2019 [total] => 25 )
   [3] => Array ( [date] => 08-01-2019 [total] => 50 )
)

Demo on 3v4l.org

【讨论】:

  • 是的,这样更好
  • 您的答案不是删除数组,而是在 $arrExpense 上显示不同的数组。
  • 您的答案不是删除数组,而是在 $arrExpense 上显示不同的数组。
  • @MengsengOeng 最终结果是一样的,这有关系吗?
  • 因为我会在 $arrExpense 中做更多的事情。我必须删除 $arrExpense 的元素。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2013-06-05
  • 2012-06-17
  • 1970-01-01
  • 2014-09-21
  • 2014-04-27
  • 2015-02-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多