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


PHP Working with an array to find ranges and missing numbers

我有一个像这样的数组:

    [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. 我想看看周围的项目的关键(它包括),并确保他们没有错过一个数字,如果他们…拒绝它…

在这个例子中,你会看到的第一个例子是:

    [5] => 1

现在环顾四周,你会发现键缺少一些数字。所以任何4的组合都不能匹配任何一个正确顺序的4。

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

在这种情况下,我希望它移动到下一个case。

    [7] => 1

请注意,由于键为7,8,9,10,因此此操作将有效。

    [7] => 1
    [8] => 2
    [9] => 3
    [10] => 4

这是我想首先返回的,但我甚至不知道如何开始。

还有这样的情况,比如数据集中根本没有1,最后一个数据集中只有这个2。

    [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
我不知道该如何处理这个问题。如果有人能提供一些建议,我将不胜感激。

下面假设您的数据位于一个名为$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;
}

工作示例:

eval.in

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

要循环遍历数组中的每个元素,可以使用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的所有连续序列,然后选择在第一个索引处值最小的序列。

希望这对你有帮助!