[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_values
0에서 시작하여 색인을 재설정 할 수 있습니다. 그런 다음 인쇄 된 요소를 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 기반 인덱서에 대해 생각할 때 응용 프로그램과 코드에서 일관성을 생각하십시오.