从源数组中删除目标数组匹配中的值

时间:2018-04-10 15:10:42

标签: php arrays yii2

例如我正在使用foreach迭代类槽 像

foreach ($result as $timeslot) {
       $time=strtotime($timeslot);
       $endTime = date("h:i A", strtotime('+' . $duration . ' minutes', $time));
       echo date('h:i', strtotime($timeslot)) . '- ' . date('h:i A', strtotime($endTime));

}

我有另一个数组foreach,它遍历progn_slot,如

foreach($booked_slot as $slot){
         $slot=strtotime($slot['start_time']);
        echo "slot<br>";
       }

var_dump $booked_slot的结果如下:

[0]=>
  object(app\modules\admin\models\OrderItem)#195 (10) {
    ["_attributes":"yii\db\BaseActiveRecord":private]=>
    array(10) {
      ["id"]=>
      int(128)
      ["user_id"]=>
      int(73)
      ["location_id"]=>
      int(2)
      ["instructor_id"]=>
      int(16)
      ["order_id"]=>
      int(54)
      ["cd_id"]=>
      int(7)
      ["price"]=>
      string(6) "300.00"
      ["date"]=>
      string(10) "2018-04-12"
      ["start_time"]=>
      string(8) "10:45:00"
      ["end_time"]=>
      string(8) "10:55:00"
    }

$ result的var_dump结果就像

    array(14) {
  [0]=>
  string(8) "10:05:00"
  [1]=>
  string(8) "10:15:00"
  [2]=>
  string(8) "10:25:00"
  [3]=>
  string(8) "10:35:00"
  [4]=>
  string(8) "10:45:00"
  [5]=>
  string(8) "10:55:00"
  [6]=>
  string(8) "11:05:00"
  [7]=>


}

我想要的是$ result是否具有匹配值 $booked_slot[0]['start_time']然后从$result

的迭代中删除该值

要实现这一个选项我尝试过就像

if(strtotime($timeslot) != $slot)

部分原因在于$result中只有一个值可以查找,但如果它有多个值,则只适用于最后一个值。

生成对象数组的查询如下:

$class_duration = ClassDuration::find()->where(['instructor_id' => $values['id']])->andwhere($cond)->all();
$booked_slot = OrderItem::find()->where(['instructor_id' => $values['id'],'date' =>$datec])->andwhere($cond)->all();

2 个答案:

答案 0 :(得分:1)

foreach() $booked_slot周围,每次迭代时都会覆盖$slot值。因此,只存储最后一个值。

您可以创建一个数组来存储所有值,并使用in_array()检查$timeslot是否在内:

$slots = [];
foreach($booked_slot as $slot){
    $slots[] = strtotime($slot['start_time']);
}

并检查:

if (!in_array(strtotime($timeslot), $slots)) {
    // $timeslot is not in $slots.
}

答案 1 :(得分:1)

最简单的方法是将所有预订的插槽放入一个数组中,以便检查此数组中是否存在时隙。

<?php
$slot_array = array();
foreach($booked_slot as $slot){
    $slot_array[]=strtotime($slot['start_time']);
    echo "slot<br>";
}
?>

<?php
    if(!in_array(strtotime($timeslot), $slot_array)){
       // not booked yet
    }
?>