[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] =>
    )

)



답변

시작 색인을 0으로 다시 색인하려면 다음을 수행하십시오.

$iZero = array_values($arr);

한 번에 시작해야하는 경우 다음을 사용하십시오.

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

사용 된 기능에 대한 매뉴얼 페이지는 다음과 같습니다.


답변

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

# 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 값을 삭제할 것이다 .)


답변

방금 당신도 할 수 있다는 것을 알았습니다

array_splice($ar, 0, 0);

다시 인덱싱이 수행되므로 원래 배열의 복사본으로 끝나지 않습니다.


답변

색인을 다시 생성하는 이유는 무엇입니까? 색인에 1을 추가하십시오.

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

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


답변

글쎄, 최종 목표가 무엇이든간에 실제로 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 ) );
}


답변

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

<?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 ) 

?>


답변

1 기반 배열을 사용하려는 이유를 고려할 수도 있습니다. 제로 기반 배열 (비 연관 배열을 사용하는 경우)은 표준이며 UI로 출력하려면 UI로 출력 할 때 정수를 늘려 솔루션을 처리합니다.

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