PHP使用数组查找范围和缺少的数字

时间:2016-11-16 16:29:30

标签: php range

我有一个如下所示的数组:

    [0] => Array
    (
        [1] => 5
        [2] => 4
        [3] => 3
        [5] => 1
        [7] => 1
        [8] => 2
        [9] => 3
        [10] => 4
        [11] => 5
    )

[1] => Array
    (
        [1] => 6
        [2] => 5
        [4] => 3
        [5] => 2
        [6] => 1
        [8] => 3
        [9] => 4
        [10] => 5
        [11] => 6
    )

[2] => Array
    (
        [1] => 7
        [2] => 6
        [3] => 5
        [4] => 4
        [5] => 3
        [6] => 2
        [7] => 3
        [8] => 4
        [11] => 7
    )

我有一个操作订单,我试图通过,我真的不知道从哪里开始。任何建议都会有很大的帮助。

  1. 首先,我向我的班级提供我想要归还的物品数量。例如,我们将使用4。

  2. 我想循环查找数组中具有最低值的项目。

  3. 我想查看周围物品的钥匙(包括在内),并确保他们不会错过任何一个号码,如果它们是......请注意它。

  4. 在这个例子中,你要来的第一个是:

        [5] => 1
    

    现在环顾四周,你会发现钥匙上缺少一些数字。因此,没有4的组合可以按正确的顺序匹配任何4。

        [1] => 5
        [2] => 4
        [3] => 3
        [5] => 1  //this one
        [7] => 1
        [8] => 2
        [9] => 3
    

    在这种情况下,我希望它转移到下一个案例。

        [7] => 1
    

    请注意,由于密钥为7,8,9,10。

    ,因此可以使用
        [7] => 1
        [8] => 2
        [9] => 3
        [10] => 4
    

    这是我想先归还的地方......但我甚至不知道如何到达那里。

    还有更多像这样的情况......例如,在数据集中根本没有1 ...而在最后一个中只有这两个。

        [0] => Array
        (
            [1] => 5
            [2] => 4
            [3] => 3
            [5] => 3
            [7] => 3
            [8] => 3
            [9] => 3
            [10] => 4
            [11] => 5
        )
    
    [1] => Array
        (
            [1] => 6
            [2] => 5
            [4] => 3
            [5] => 3
            [6] => 3
            [8] => 3
            [9] => 4
            [10] => 5
            [11] => 6
        )
    
    [2] => Array
        (
            [1] => 7
            [2] => 6
            [5] => 3
            [6] => 2 // this one
            [7] => 3
            [8] => 4
            [11] => 7
        )
    

    以下不会起作用:

        [6] => 2 // this one
        [7] => 3
        [8] => 4
        [11] => 7
    

    但是这个会:

            [5] => 3
            [6] => 2 // this one
            [7] => 3
            [8] => 4
    

    我不知道如何处理这个问题。如果有人可以提供一些建议,那将非常感激。非常感谢提前。

2 个答案:

答案 0 :(得分:1)

以下假设您的数据位于名为$data的数组中。我将逐步描述它,然后将它们作为一个函数组合在一起。

第1步找到最小值:

$minValue=min($data);

第2步循环遍历数组,查找该值的所有值:

foreach($data as $index => $value){

    if($value == $minValue){
         // $index is a candidate!
    }
}

第3步检查索引后是否存在$valuesToReturn条目:

    $success=true;

    for($i=1;$i<=$valuesToReturn;$i++){

        if(!array_key_exists($index + $i,$data)){

            // Candidate failed.
            $success=false;
            break;

        }

    }

第4步如果候选人成功,请将其退回。

    if($success){
        return $index;
    }

总而言之,我们得到了这个:

function findSuitableIndex($data,$valuesToReturn){

    // Min:
    $minValue=min($data);

    foreach($data as $index => $value){

        if($value == $minValue){
            // $index is a candidate!

            // test if index is actually suitable:
            $success=true;

            for($i=1;$i<=$valuesToReturn;$i++){

               if(!array_key_exists($index + $i,$data)){

                    // Candidate failed.
                    $success=false;
                    break;

                }

            }

            if($success){
                return $index;
            }

        }

    }

    // If we fell down here, we failed to find any successful results.
    return -1;
}

工作样本:

Code on eval.in

答案 1 :(得分:0)

以下是一些建议。您的具体实施将取决于您的具体情况。

要循环遍历数组中的每个元素,可以使用foreach循环。

foreach ($arr[0] as $index => $value) {
    // Here, $arr[0][$index] == $value;

}

要检查密钥是否存在,您可以使用array_key_exists

if ( !array_key_exists($index - 1, $arr[0]) ) {
    // The previous index is missing in the array.

}

在第一个索引处找到具有最小值的k索引的连续序列的简单(但效率低)方法是找到最小元素并检查连续序列是否存在;如果没有,找到下一个最小元素并递归检查,直到你完成处理最大元素。

您还可以尝试查找至少长度为k的所有连续序列,然后在第一个索引处选择值最小的序列。

希望这有帮助!