PHP에서 배열을 어떻게 다시 색인합니까?
PHPPHP에서 배열을 어떻게 다시 색인합니까?
나는 다음과 같은 배열을 가지고 있는데, 나는 키가 반전되어 (이상적으로 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.
0에서 시작하여 색인을 다시 생성하려면 다음을 수행하십시오.
$iZero = array_values($arr);
하나부터 시작해야하는 경우 다음을 사용하십시오.
$iOne = array_combine(range(1, count($arr)), array_values($arr));
다음은 사용 된 함수에 대한 매뉴얼 페이지입니다.
-
==============================
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.
왜 다시 색인 생성합니까? 색인에 1을 더하십시오.
foreach ($array as $key => $val) { echo $key + 1, '<br>'; }
편집 질문이 명확해진 후 : array_values를 사용하여 0에서 시작하는 색인을 재설정 할 수 있습니다. 그런 다음 인쇄 된 요소를 1에서 시작하려는 경우 위의 알고리즘을 사용할 수 있습니다.
-
==============================
4.
방금 네가 할 수있는 걸 알았어.
array_splice($ar, 0, 0);
그러면 다시 색인 생성이 수행되므로 원래 배열의 복사본으로 끝나지 않습니다.
-
==============================
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.
이것은 당신이 원하는 것을 할 것입니다 :
<?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.
보다 우아한 솔루션 : $ list = array_combine (range (1, count ($ list)), array_values ($ list));
-
==============================
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.
왜 1 기반 배열을 사용하고 싶은지 고려해보십시오. 0 기반 어레이 (비 연관 배열을 사용하는 경우)는 꽤 표준 적이며, UI로 출력하려는 경우 대부분은 UI에 출력 할 때 정수를 증가시킴으로써 솔루션을 처리합니다.
배열에 대한 1 기반 인덱서를 생각할 때 응용 프로그램과 코드에서 일관성을 생각하십시오.
-
==============================
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.
$tmp = array(); foreach (array_values($array) as $key => $value) { $tmp[$key+1] = $value; } $array = $tmp;
-
==============================
12.
배열의 순서를 바꾸지 않으려면 다음과 같이하면됩니다.
$ array = array_reverse ($ array); $ array = array_reverse ($ array);
array_reverse는 매우 빠르며 반대 방향으로 재 배열됩니다. 누군가는 오래 전 나에게 이걸 보여 줬어. 그래서 나는 그걸 생각해 내는데 공을 세울 수 없다. 그러나 그것은 매우 간단하고 빠릅니다.
-
==============================
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.
정렬은 일종의 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.
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.
여기에 내 자신의 구현입니다. 입력 배열의 키는 $ 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.
새로운 배열을 만들면 괜찮습니다.
$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
from https://stackoverflow.com/questions/591094/how-do-you-reindex-an-array-in-php by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
PHP를 사용하여 html에서 img src, title 및 alt를 추출하는 방법은 무엇입니까? (0) | 2018.09.04 |
---|---|
PHP를위한 최상의 XML 파서 [duplicate] (0) | 2018.09.04 |
"\ u00ed"와 같은 유니 코드 이스케이프 시퀀스를 올바른 UTF-8 인코딩 문자로 디코딩하는 방법? (0) | 2018.09.04 |
PHP : 배열에서 두 날짜 사이의 모든 날짜를 반환합니다. (0) | 2018.09.04 |
PHP : 임의의 고유 한 영숫자 문자열을 생성하는 방법은 무엇입니까? (0) | 2018.09.04 |