복붙노트

PHP에서 배열을 어떻게 다시 색인합니까?

PHP

PHP에서 배열을 어떻게 다시 색인합니까?

나는 다음과 같은 배열을 가지고 있는데, 나는 키가 반전되어 (이상적으로 1에서 시작하기 때문에) 다시 색인하고 싶다.

현재 배열 (편집 : 실제로 배열 모양) :

Array (

[2] => Object
    (
        [title] => Section
        [linked] => 1
    )

[1] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[0] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)

그것이되어야하는 방법 :

Array (

[1] => Object
    (
        [title] => Section
        [linked] => 1
    )

[2] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[3] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)

해결법

  1. ==============================

    1.

    0에서 시작하여 색인을 다시 생성하려면 다음을 수행하십시오.

    $iZero = array_values($arr);
    

    하나부터 시작해야하는 경우 다음을 사용하십시오.

    $iOne = array_combine(range(1, count($arr)), array_values($arr));
    

    다음은 사용 된 함수에 대한 매뉴얼 페이지입니다.

  2. ==============================

    2.

    가장 좋은 방법은 다음과 같습니다.

    # Array
    $array = array('tomato', '', 'apple', 'melon', 'cherry', '', '', 'banana');
    

    그 반환

    Array
    (
        [0] => tomato
        [1] => 
        [2] => apple
        [3] => melon
        [4] => cherry
        [5] => 
        [6] => 
        [7] => banana
    )
    

    이렇게하면

    $array = array_values(array_filter($array));
    

    너는 이걸 얻는다.

    Array
    (
        [0] => tomato
        [1] => apple
        [2] => melon
        [3] => cherry
        [4] => banana
    )
    

    설명

    array_values ​​() : 입력 배열의 값과 인덱스를 숫자로 반환합니다.

    array_filter () : 사용자 정의 함수 (UDF)가있는 배열의 요소를 필터링합니다. 제공되지 않으면 FALSE로 평가 된 입력 테이블의 모든 항목이 삭제됩니다.

  3. ==============================

    3.

    왜 다시 색인 생성합니까? 색인에 1을 더하십시오.

    foreach ($array as $key => $val) {
        echo $key + 1, '<br>';
    }
    

    편집 질문이 명확해진 후 : array_values를 사용하여 0에서 시작하는 색인을 재설정 할 수 있습니다. 그런 다음 인쇄 된 요소를 1에서 시작하려는 경우 위의 알고리즘을 사용할 수 있습니다.

  4. ==============================

    4.

    방금 네가 할 수있는 걸 알았어.

    array_splice($ar, 0, 0);
    

    그러면 다시 색인 생성이 수행되므로 원래 배열의 복사본으로 끝나지 않습니다.

  5. ==============================

    5.

    자, 최종 목표가 무엇이든, 실제로는 0 기반이 아닌 1 기반으로 배열을 수정할 필요는 없지만 대신 Gumbo와 같은 반복 시간에 처리 할 수 ​​있다고 생각하고 싶습니다.

    그러나 질문에 대답하기 위해이 함수는 모든 배열을 1 기반 버전으로 변환해야합니다

    function convertToOneBased( $arr )
    {
        return array_combine( range( 1, count( $arr ) ), array_values( $arr ) );
    }
    

    여기 당신이 그것을 원한다면 더 재사용 가능 / 유연한 기능이 있습니다.

    $arr = array( 'a', 'b', 'c' );
    
    echo '<pre>';
    print_r( reIndexArray( $arr ) );
    print_r( reIndexArray( $arr, 1 ) );
    print_r( reIndexArray( $arr, 2 ) );
    print_r( reIndexArray( $arr, 10 ) );
    print_r( reIndexArray( $arr, -10 ) );
    echo '</pre>';
    
    function reIndexArray( $arr, $startAt=0 )
    {
        return ( 0 == $startAt )
            ? array_values( $arr )
            : array_combine( range( $startAt, count( $arr ) + ( $startAt - 1 ) ), array_values( $arr ) );
    }
    
  6. ==============================

    6.

    이것은 당신이 원하는 것을 할 것입니다 :

    <?php
    
    $array = array(2 => 'a', 1 => 'b', 0 => 'c');
    
    array_unshift($array, false); // Add to the start of the array
    $array = array_values($array); // Re-number
    
    // Remove the first index so we start at 1
    $array = array_slice($array, 1, count($array), true);
    
    print_r($array); // Array ( [1] => a [2] => b [3] => c ) 
    
    ?>
    
  7. ==============================

    7.

    보다 우아한 솔루션 : $ list = array_combine (range (1, count ($ list)), array_values ​​($ list));

  8. ==============================

    8.

    새로운 배열이 1과 같은 색인으로 시작되도록 배열을 다시 색인 할 수 있습니다.

    $arr = array(
      '2' => 'red',
      '1' => 'green',
      '0' => 'blue',
    );
    
    $arr1 = array_values($arr);   // Reindex the array starting from 0.
    array_unshift($arr1, '');     // Prepend a dummy element to the start of the array.
    unset($arr1[0]);              // Kill the dummy element.
    
    print_r($arr);
    print_r($arr1);
    

    위 출력은 다음과 같습니다.

    Array
    (
        [2] => red
        [1] => green
        [0] => blue
    )
    Array
    (
        [1] => red
        [2] => green
        [3] => blue
    )
    
  9. ==============================

    9.

    왜 1 기반 배열을 사용하고 싶은지 고려해보십시오. 0 기반 어레이 (비 연관 배열을 사용하는 경우)는 꽤 표준 적이며, UI로 출력하려는 ​​경우 대부분은 UI에 출력 할 때 정수를 증가시킴으로써 솔루션을 처리합니다.

    배열에 대한 1 기반 인덱서를 생각할 때 응용 프로그램과 코드에서 일관성을 생각하십시오.

  10. ==============================

    10.

    @monowerker와 비슷하게 객체의 키를 사용하여 배열을 다시 색인해야했습니다 ...

    $new = array();
    $old = array(
      (object)array('id' => 123),
      (object)array('id' => 456),
      (object)array('id' => 789),
    );
    print_r($old);
    
    array_walk($old, function($item, $key, &$reindexed_array) {
      $reindexed_array[$item->id] = $item;
    }, &$new);
    
    print_r($new);
    

    그 결과 :

    Array
    (
        [0] => stdClass Object
            (
                [id] => 123
            )
        [1] => stdClass Object
            (
                [id] => 456
            )
        [2] => stdClass Object
            (
                [id] => 789
            )
    )
    Array
    (
        [123] => stdClass Object
            (
                [id] => 123
            )
        [456] => stdClass Object
            (
                [id] => 456
            )
        [789] => stdClass Object
            (
                [id] => 789
            )
    )
    
  11. ==============================

    11.

    $tmp = array();
    foreach (array_values($array) as $key => $value) {
        $tmp[$key+1] = $value;
    }
    $array = $tmp;
    
  12. ==============================

    12.

    배열의 순서를 바꾸지 않으려면 다음과 같이하면됩니다.

    $ array = array_reverse ($ array); $ array = array_reverse ($ array);

    array_reverse는 매우 빠르며 반대 방향으로 재 배열됩니다. 누군가는 오래 전 나에게 이걸 보여 줬어. 그래서 나는 그걸 생각해 내는데 공을 세울 수 없다. 그러나 그것은 매우 간단하고 빠릅니다.

  13. ==============================

    13.

    중복 제거 및 배열 다시 색인화 :

    <?php  
       $oldArray = array('0'=>'php','1'=>'java','2'=>'','3'=>'asp','4'=>'','5'=>'mysql');
       //duplicate removal
       $fillteredArray = array_filter($oldArray);
       //reindexing actually happens  here
       $newArray = array_merge($filteredArray);
       print_r($newArray);
    ?>
    
  14. ==============================

    14.

    정렬은 일종의 sort () 일 뿐이지 만, 다시 색인 생성하는 것은 어리석은 것처럼 보입니다.하지만 필요한 경우 다시 처리해야합니다. 비록 제자리에 있지 않습니다. 한 번에 여러 번 작업 할 경우 array_walk ()를 사용하고 일회성 작업 인 경우 for-key-value 루프를 사용하십시오.

    <?php
    
    function reindex(&$item, $key, &$reindexedarr) {
        $reindexedarr[$key+1] = $item;
    }
    
    $arr = Array (2 => 'c', 1 => 'b', 0 => 'a');
    
    sort($arr);
    $newarr = Array();
    array_walk($arr, reindex, &$newarr);
    $arr = $newarr;
    print_r($arr); // Array ( [1] => a [2] => b [3] => c )
    
    ?>
    
  15. ==============================

    15.

    Nick의 공헌과 마찬가지로 배열을 다시 색인 할 때도 동일한 해결책을 찾았지만 PHP 5.4 버전부터 함수를 향상 시켰습니다. 변수를 참조로 전달하기 때문에 작동하지 않습니다. 재 인덱싱 함수의 예는 use keyword closure를 사용하여 다음과 같습니다.

    function indexArrayByElement($array, $element)
    {
        $arrayReindexed = [];
        array_walk(
            $array,
            function ($item, $key) use (&$arrayReindexed, $element) {
                $arrayReindexed[$item[$element]] = $item;
            }
        );
        return $arrayReindexed;
    }
    
  16. ==============================

    16.

    여기에 내 자신의 구현입니다. 입력 배열의 키는 $ start_index부터 키가 증가하여 번호가 다시 매겨집니다.

    function array_reindex($array, $start_index)
    {
        $array = array_values($array);
        $zeros_array = array_fill(0, $start_index, null);
        return array_slice(array_merge($zeros_array, $array), $start_index, null, true);
    }
    
  17. ==============================

    17.

    새로운 배열을 만들면 괜찮습니다.

    $result = array();
    foreach ( $array as $key => $val )
        $result[ $key+1 ] = $val;
    

    필요한 경우 역전을해야하므로 역순으로 실행해야합니다.

    for ( $k = count($array) ; $k-- > 0 ; )
        $result[ $k+1 ] = $result[ $k ];
    unset( $array[0] );   // remove the "zero" element
    
  18. from https://stackoverflow.com/questions/591094/how-do-you-reindex-an-array-in-php by cc-by-sa and MIT lisence