我有一个像这样的数组:
[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
)
我有一个操作顺序,我想要完成,我真的不知道从哪里开始。任何建议都将大有帮助。
首先,我给我的类我想要返回的项目的数量。例如,这里我们将使用4.
我想循环遍历并找到数组中具有最低值的项。
我想看看周围的项目的关键(它包括),并确保他们没有错过一个数字,如果他们…拒绝它…
在这个例子中,你会看到的第一个例子是:
[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
的所有连续序列,然后选择在第一个索引处值最小的序列。
希望这对你有帮助!