【问题标题】:PHP check if value in array is smaller than previous value in array per IDPHP检查数组中的值是否小于每个ID数组中的先前值
【发布时间】:2016-04-19 12:11:18
【问题描述】:

我有一个存储 ID 的数组,每个 ID 都有一个包含开始值和结束值的数组。我的目标是检查起始值是否小于数组中它之前的项目的结束值。

这可行,但我的循环不关心 ID,我需要一种方法来按 ID 执行此操作

这是我的数组的样子:

Array
(
    [892] => Array
        (
            [41] => Array
                (
                    [0] => Array
                        (
                            [start] => 0930
                            [end] => 1200
                        )

                )

        )

    [897] => Array
        (
            [41] => Array
                (
                    [0] => Array
                        (
                            [start] => 1000
                            [end] => 1230
                        )

                )

        )

    [898] => Array
        (
            [41] => Array
                (
                    [0] => Array
                        (
                            [start] => 1100
                            [end] => 1300
                        )

                )

        )

    [901] => Array
        (
            [52] => Array
                (
                    [0] => Array
                        (
                            [start] => 0930
                            [end] => 1030
                        )

                )

        )

    [903] => Array
        (
            [52] => Array
                (
                    [0] => Array
                        (
                            [start] => 0930
                            [end] => 1030
                        )

                )

        )

    [904] => Array
        (
            [41] => Array
                (
                    [0] => Array
                        (
                            [start] => 1000
                            [end] => 1230
                        )

                )

        )

)

这就是我的循环的样子:

$foundOverlap = false;
$prevEnd = null;
foreach($slots as $s){

     $startHour = $s[0]['start'];
     $endHour = $s[0]['end'];
     echo $startHour . '<br>';
     echo $endHour . '<br>';

     if($prevEnd !== null && $startHour < $prevEnd){
         $foundOverlap = true;
         $counter++;
     } 

     if($foundOverlap){
        echo 'overlap <br>';
     }else{
        echo 'no overlap <br>';
     }

     $prevEnd = $endHour;

}

结果我得到没有重叠(好),重叠(好),重叠(好),重叠(坏!)这应该没有重叠。但它说重叠,因为它检查前一个数组项并不关心attractieID 是什么......

请知道我该如何解决这个问题?

我会很感激的!!

提前致谢!

【问题讨论】:

  • 你今天已经问过同样的问题了。这是链接(stackoverflow.com/questions/36714467/…
  • @Ms.Nehal 我删除了这个问题,因为我的代码有一些错误
  • attractieID 保存在变量中,例如$preID 并将其更新为 $prevEnd 然后在 if($prevEnd !== null &amp;&amp; $startHour &lt; $prevEnd &amp;&amp; $currentID == $preID)
  • @MuhammadKashifAbbasi $currentID 应该是什么?
  • atr 每次都重置$foundOverlap = true;。每次使用 $foundOverlap = false; 到你的 foreach 循环。

标签: php arrays loops


【解决方案1】:

看看这个

$result = [];
foreach($array as $element) {
    if(!isset($result[$element['attractiveID']])) {
        $result[$element['attractiveID']]['overlap'] = false;
        $result[$element['attractiveID']]['prevHour'] = $element[0]['end'];
        continue;
    }

    if($element[0]['start'] < $result[$element['attractiveID']]['prevHour']) {
        $result[$element['attractiveID']]['overlap'] = true;
    }

    $result[$element['attractiveID']]['prevHour'] = $element[0]['end'];
}

和数组传递:

$array = [
    [
        'attractiveID' => 41,
        [
            'start' => 930,
            'end' => 1200
        ]
    ],
    [
        'attractiveID' => 41,
        [
            'start' => 1000,
            'end' => 1230
        ]
    ],
    [
        'attractiveID' => 41,
        [
            'start' => 1100,
            'end' => 1300
        ]
    ],
    [
        'attractiveID' => 52,
        [
            'start' => 1000,
            'end' => 1230
        ]
    ],
];

【讨论】:

    【解决方案2】:

    根据 Muhammad Kashif Abbasi 的评论,我想给你一个解决方案

    试试这个代码

    $foundOverlap = false;
    $prevEnd = null;
    $preID = null;
    foreach($slots as $s){
    
         $startHour = $s[0]['start'];
         $endHour = $s[0]['end'];
         $currentID = $s['attractieID']; //got the current attractieID
         echo $startHour . '<br>';
         echo $endHour . '<br>';
    
         if($prevEnd !== null && $startHour < $prevEnd && $currentID == $preID){ // checked current id and previous id
             $foundOverlap = true;
             $counter++;
         } 
    
         if($foundOverlap){
            echo 'overlap <br>';
         }else{
            echo 'no overlap <br>';
         }
         $foundOverlap = false; //reseted $foundOverlap
         $prevEnd = $endHour;
         $preID = $currentID; //set the current id as previous id
    
    }
    

    【讨论】:

    • 这似乎可行,但我有一个问题。如果数组没有正确排序怎么办。就像如果您有一个 id 为 41 的项目,然后是一个 id 为 52 的项目,然后又是 41。发生这种情况时它似乎不起作用。
    • 你需要按照你想要的顺序正确传递数组。
    • 您知道如何按 id 对数组进行排序吗?
    • stackoverflow.com/questions/2699086/…查看此链接进行排序
    • usort($slots, function($a, $b) { return $a['attractieID'] - $b['attractieID']; });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多