【问题标题】:Rearrange array by loop and next element value check通过循环和下一个元素值检查重新排列数组
【发布时间】:2021-02-18 11:30:36
【问题描述】:

我正在尝试通过检查循环和下一个值匹配来重新排列我的数组。

这里如果当前元素值为0,下一个元素值为5

它将通过 $nextCheck 值进行检查

如果 5 之前的元素个数

我想将该值从 0 更改为 1

我当前的数组是这样的

$arr_calendar = array (
   '2020-11-07' => Array
    (
        '18:00' => 5,
        '18:15' => 5,
        '18:30' => 0,
        '18:45' => 0,
        '19:15' => 0,
        '19:30' => 0,
        '20:00' => 5,
        '20:15' => 5,
        '20:30' => 5,
        '20:45' => 5,
        '21:00' => 5,
        '21:15' => 5,
        '21:30' => 5,
        '21:45' => 5,
    )
);

我预期的数组会是这样的

    Array
(
    [2020-11-07] => Array
        (
            [18:00] => 5 
            [18:15] => 5
            [19:30] => 0
            [18:45] => 0
            [19:15] => 1
            [19:30] => 1
            [20:00] => 5
            [20:15] => 5
            [20:30] => 5
            [20:45] => 5
            [21:00] => 5
            [21:15] => 5
            [21:30] => 5
            [21:45] => 5
        )

)

为此我尝试过这样的

$arr_calendar = array (
       '2020-11-07' => Array
        (
            '18:00' => 5,
            '18:15' => 5,
            '18:30' => 0,
            '18:45' => 0,
            '19:15' => 0,
            '19:30' => 0,
            '20:00' => 5,
            '20:15' => 5,
            '20:30' => 5,
            '20:45' => 5,
            '21:00' => 5,
            '21:15' => 5,
            '21:30' => 5,
            '21:45' => 5,
        )
    );
$nextCheck =3;
foreach ($arr_calendar as $date => $arr_hour) {
    
    $arr_hour_checked = array();
            foreach ($arr_hour as $hour => $disable) {
                $arr_hour_checked[] = array(
                    'hour' => $hour,
                    'disable' => $disable
                );
            }
            $arr_hour_checked[] = array(// Fake for last item
                'hour' => '',
                'disable' => 99
            );
    
    for($index1 = 0; $index1 < count($arr_hour_checked); $index1++) {
       
        
        if ($arr_hour_checked[$index1]['disable'] == 0) {
            for($index2 = $index1 + 1; $index2 < count($arr_hour_checked); $index2++) {
                if ($index2 - $index1 < $nextCheck) {
                    for ($step = $index1; $step < $index2; $step++) {
                        $arr_calendar[$date][$hour] = 1;

                    }
                } else {
                    for ($step = $index2 - $nextCheck + 1; $step < $index2; $step++) {
                        $arr_calendar[$date][$hour] = 1;
                    }
                }
                $index1 = $index2 - 1;
                break;
            }
        }
    }
}

print_r ($arr_calendar);

请建议我在这里错过了什么 FIDDLE

对不起我的英语。如果 nextCheck = 3

一0后二1会来。 问:如果序列为 0,5,0,5

结果:将会是 1,5,1,5

问:如果序列为 1,5,1,5

结果:将会是 1,5,1,5

问: 如果 5,5,0,0,0,0,5,5,5,0,0,0,5,0,0,0,0,0,5

结果: 那么串口可以是这样的

5,5,0,0,1,1,5,5,5,0,1,1,5,0,0,0,1,1,5

【问题讨论】:

  • 您能详细说明一下吗?基本上将所有 0 设置为 1 直到 $nextCheck - 1 ?
  • 对不起我的英语。如果 nextCheck = 3 那么串行可以是这样的 5,5,0,0,1,1,5,5,5,0,1,1,5,0,0,0,1,1,5 @nice_dev
  • 一0后二1会来。如果序列 0,5,0,5 它将是 1,5,1,5 @nice_dev
  • 所以0,5,0,5 应该是0,1,1,5,0,1,1,5 ..
  • @nice_dev no, 0,5,0,5 将是 1,5,1,5 如果 0 大于 2 像 0,0,0,5 那么它将是 0,1,1 ,5

标签: php arrays loops multidimensional-array


【解决方案1】:

问题陈述并不完全清楚,但是您似乎想在 5 之前将所有 0 设置为 1。设置为 1 的零的总数将是 $nextCheck - 1

foreach($arr_calendar as $date => &$value){
    $count = 0;
    foreach(array_reverse($value) as $time => $val){
        if($val == 5) $count = $nextCheck;
        else if($val == 0 && $count > 1){
            $value[$time] = 1;
            $count--;
        }
    }
}

所以,你从最后一个循环到第一个,每当你得到一个值5,你就将计数设置为$nextCheck。对于 5 之后的所有 0,您可以将其设置为 1 直到 $count - 1 次。

演示: https://3v4l.org/AXsVC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2016-04-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多