>

배열은 실제로 PHP에서 트리가 정렬되어 있다는 것을 알고 있습니다. 주어진 배열 인덱스 (정수 키)는 엄격한 순서로 또는 전혀 존재할 필요가 없습니다. 따라서 다음과 같은 배열이 있습니다 :

array( 1 => 'A', 5 => 'B', 2 => 'C', 3 => 'D', 6 => 'E', 0 => 'F' )

어떻게 배열을 다시 색인화하지 않고 첫 번째 빈 키의 가장 낮은 (음수가 아닌) 정수를 결정할 수 있습니까? 이 경우 4 입니다 .


  • 답변 # 1

    while 의 간편한 솔루션  루프 :

    function firstFreeKey($array)
    {
      $i = 0;
      while(isset($array[$i])) $i++;
      return $i;
    }
    $array = array( 1 => 'A', 5 => 'B', 2 => 'C', 3 => 'D', 6 => 'E', 0 => 'F' );
    echo firstFreeKey($array);
    
    

    출력 :

    4
    
    

  • 답변 # 2

    첫 번째 방법은 배열에 화려합니다.

    // STUPID FANCY WAY (playing with arrays)
    $array = array( 1 => 'A', 5 => 'B', 2 => 'C', 3 => 'D', 6 => 'E', 0 => 'F' );
    // fetch existing keys
    $keys = array_keys($array);
    // build a range with all keys (between min and max)
    $keys_all = range(min($keys), max($keys));
    // difference between all and existing
    $keys_diff = array_diff($keys_all, $keys);
    // fetch the first in difference (min)
    $min_key = reset($keys_diff);
    // output it
    var_dump($min_key);
    
    

    두 번째 방법은 실제로 메모리에 추가 배열이 필요 없기 때문에 실행 가능합니다.

    // PROPER WAY (not extra array operations)
    $array = array( 1 => 'A', 5 => 'B', 2 => 'C', 3 => 'D', 6 => 'E', 0 => 'F' );
    // fetch existing keys
    $keys = array_keys($array);
    // nullify first
    $min_key = null;
    // loop all keys and find missing one (skip 1st and last, they totally exist!)
    for($key = ($min = min($keys)) + 1, $max = max($keys); $key < $max; ++$key){
        if(!isset($array[$key])){
            $min_key = $key;
            break;
        }
    }
    // output it
    var_dump($min_key);
    
    

    의견이 충분하지 않은 경우 설명하겠습니다.

    PS:이 방법은 최소 키 값이 0 가 아닌 상황을 처리합니다. . 따라서 범위 min 와 독립적입니다.  그리고 max . 그리고 키는 분명히 정수 여야합니다.

  • 답변 # 3

    $a = array( 1 => 'A', 5 => 'B', 2 => 'C', 3 => 'D', 6 => 'E', 0 => 'F' );
    for($i = 0, $l = count($a); $i < $l; $i++) if(!array_key_exists($i, $a)) break;
    echo $i; // 4
    
    

  • 답변 # 4

    같은 것을 시도해 보셨습니까

    echo min(array_keys($array));
    
    

    array_keys  배열의 키 목록을 반환하고 min  배열에서 가장 낮은 값을 결정합니다.

    다음 댓글 확장 :

    배열이 연속적인 int 값이므로 다음을 수행 할 수 있습니다

    $keys = array_keys($array);
    $arr2 = range(0,max($keys));
    // diff gets the missing elements
    $missing = array_diff($arr2,$keys);
    echo $missing[0];
    
    

    이 무차별 대차의 성능에 대해서는 확신 할 수 없지만 시험 할 수 있습니다.

  • 답변 # 5

    가장 긴 답변 중 하나이지만 가장 많이 설명 된 것입니다.

    $Jumbled_Arr = array(
    1 => "test",
    3 => "another",
    4 => "t",
    7 => "kfkfk",
    9 => "fk"
    
    );
    function GetMissingKey($Array,$Return_Type = false){
        // Get the Maximum Key Value
        $Max_Key = max(array_keys($Array));
            // Treat this as the default array index, as all numerical arrays start at a 0 key set
            $Counter = 0;
            // A Blank array to be maniuplated
        $Generated_Array = array();
            // Generate a full array based on the maximum value and the array index, this will create a keyset from 0 to the highest value 
        while ($Counter < $Max_Key){
                $Generated_Array[] = $Counter;
            $Counter++;
        }   
        // Discover the differences between the correctly formed array and the specified array keys 
        $Missing_Key = array_diff($Generated_Array,array_keys($Array));
                // Work with the second parameter, as the settings. 
            if ($Return_Type === true){
            // If set to true, we are expecting more than 1 free key within the array, so we will return the entire array 
                return $Missing_Key;
            }elseif ($Return_Type === false){
            // If set to false (or blank) we are expecting a single free key to be discovered & we will return it as an imploded array
                return implode($Missing_Key);
            }
    }
        print_R(GetMissingKey($Jumbled_Arr,true));
    
    
    이 함수에 true가 전달되면 누락 된 키 배열이 반환됩니다.

    false가 전달되면 단일 정수로 리턴됩니다 (하나 이상의 키가 리턴 될 경우주의하십시오).

  • 이전 reactjs - 환경 변수를 설정 했는데도 Reg가 인식되지 않습니다
  • 다음 javascript - 슬라이드 쇼에서 작동하지 않는 이전 버튼