获取存在值的数组中的最小和最大位置

时间:2019-06-17 14:17:07

标签: php

我需要在存在某些值的数组中找到最小和最大位置! 在一个循环中使用一个循环比较值不是一个选择(我的数组有100.000个值)

e.g =

$myarray[0]="red";
$myarray[1]="red";
$myarray[2]="blue";
$myarray[3]="blue";
$myarray[4]="blue";
$myarray[5]="red";

如何获取蓝色存在的最小和最大位置?

4 个答案:

答案 0 :(得分:1)

将第二个参数用于array_keys

if($blue = array_keys($myarray, 'blue')) {
    $min = min($blue);
    $max = max($blue);
}

答案 1 :(得分:0)

您可以将array_keys与search_value一起使用,以提取所有匹配的键,然后分别使用maxmin来获取想要的两个键。

$keys = array_keys($myarray,'blue'); //[2,3,4]
$maxKey = max($keys); //4
$minKey = min($keys); //2

我必须建议明智的选择执行for循环会更好:

$length = count($myarray);
$minKey = FALSE;
$maxKey = FALSE;
$search = 'blue';
for($i=0;$i<$length;$i++){
  if($myarray[$i] == $search){
    if($minKey === FALSE) $minKey = $i;
    $maxKey = $i;
  }
}

答案 2 :(得分:0)

这可能是答案吗?

function getMinKey($arr, $search){
    if(!in_array($search, $arr)){
        return false;
    }

    foreach($arr as $key => $value){
        if($value == $search){
            return $key;
        }
    }
}

function getMaxKey($arr, $search){
    if(!in_array($search, $arr)){
        return false;
    }

    $arrCount = count($arr)-1;
    for($i = $arrCount; $i >=0; $i--){
        if($arr[$i] == $search){
            return $i;
        }
    }
}

答案 3 :(得分:0)

到目前为止,所有解决方案都搜索了整个数组,这可能效率很低。您只需要从头开始搜索到第一个“蓝色”,然后从头到尾搜索到最后一个“蓝色”。像这样:

$find  = "blue";
$first = false;
$last  = false;

$max = count($myarray);
$key = 0;
while ($key < $max) {
    if ($myarray[$key] == $find) {
        $first = $key;
        break;
    }
    $key++;
}
if ($first !== false) {
    $key = --$max;
    while ($key > 0) {
        if ($myarray[$key] == $find) {
            $last = $key;
            break;
        }
        $key--;
    }
}

请注意,此代码考虑到将找不到任何内容。在这种情况下,$first$last将包含false。它还检查看看是否发现$first可以防止在不必要的情况下两次不搜索数组。