2016-11-16 25 views
0

我有一个看起来像这样的数组:PHP使用数组找到范围和失踪数字

[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. 我想在关键的项目环顾四周(它包括了),并确保他们不会错过了一些,如果他们are..reject吧..

在这个例子中,第一个你会来:

[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,最后一个只有这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 

我对如何处理这个。如果有人可以提供一些建议,它会不知道非常感谢。非常感谢提前。

+0

不清楚你所说的 “缺少了一些” - 在你的榜样,' [6]'也缺少,但'[7]'被接受。假设它即将接受,比如'[7]',那么下面的x必须存在? –

+0

是的!如果它接受7.然后,我想要4,5,6存在..或5,6,8 ..或8,9,10 ...因为我的初始输入只是寻找4. –

回答

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

+0

WOW !你是我的英雄!!!!现在我只需要使它返回数组中的工作4结果。我建议大家现在都赞成这个,因为它非常完美。非常感谢! –

+1

@JoelHasSimpleQuestions没问题!我只是很快重新阅读这个问题,所以有一件事可能会引起你的注意:如果$ valuesToReturn是4,那么它会检查'候选'索引后面的4个条目。如果你只希望它检查下面的内容,那么将'$ i <= $ valuesToReturn'更改为'$ i <$ valuesToReturn' 3 :)要返回一个数组,最简单的方法是复制/粘贴相同的循环并执行例如'$ result [] = $ data [$ index + $ i];' –

+1

@JoelHasSimpleQuestions我个人的选择是在一个单独的函数中做最后一部分 - 这样,只要索引有用,就可以得到索引。 –

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的所有连续序列,然后在第一个索引处选择具有最小值的序列。

希望这会有所帮助!