programing

어레이 요소를 삭제하고 어레이를 재인덱스화하는 방법

javaba 2022. 9. 16. 22:51
반응형

어레이 요소를 삭제하고 어레이를 재인덱스화하는 방법

배열에 문제가 있습니다.아래와 같이 수정하고 싶은 어레이가 1개 있습니다.인덱스로 요소(요소)를 제거한 후 배열을 다시 인덱싱합니다.가능합니까?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array
array_splice($array, 0, 1);

http://php.net/manual/en/function.array-splice.php

를 사용하는 것이 좋습니다.그러면 어레이의 첫 번째 요소가 반환되고 어레이에서 해당 요소를 제거한 후 어레이를 다시 인덱싱합니다.이 모든 것을 하나의 효율적인 방법으로.

array_splice($array, array_search(array_value, $array), 1);
Unset($array[0]); 

Sort($array); 

왜 이것이 낮게 평가되고 있는지는 모르겠지만, 누군가 시도하려고 한다면 효과가 있다는 것을 알게 될 것이다.어레이에서 정렬을 사용하면 어레이의 키가 재할당됩니다.유일한 단점은 값이 정렬된다는 것입니다.열쇠는 분명히 재할당될 것이기 때문에array_values값이 정렬되어 있는지 여부는 중요하지 않습니다.

PHP 7.4의 2020 벤치마크

현재 답변에 만족하지 못하는 사용자를 위해 벤치마크 스크립트를 작성했습니다.CLI에서 누구나 실행할 수 있습니다.

다음 두 가지 솔루션을 비교합니다.

unset()에 array_values() VS array_splice()지정합니다.

<?php

echo 'php v' . phpversion() . "\n";

$itemsOne = [];
$itemsTwo = [];

// populate items array with 100k random strings
for ($i = 0; $i < 100000; $i++) {
    $itemsOne[] = $itemsTwo[] = sha1(uniqid(true));
}

$start = microtime(true);

for ($i = 0; $i < 10000; $i++) {
    unset($itemsOne[$i]);
    $itemsOne = array_values($itemsOne);
}

$end = microtime(true);

echo 'unset & array_values: ' . ($end - $start) . 's' . "\n";

$start = microtime(true);

for ($i = 0; $i < 10000; $i++) {
    array_splice($itemsTwo, $i, 1);
}

$end = microtime(true);

echo 'array_splice: ' . ($end - $start) . 's' . "\n"; 

보시는 바와 같이 아이디어는 간단합니다.

  • 동일한 10만 개의 항목을 사용하여 2개의 어레이를 만듭니다(임의로 생성된 문자열).
  • unset() 및 array_values()를 사용하여 첫 번째 어레이에서 10,000개의 첫 번째 항목을 제거하고 다시 인덱싱합니다.
  • array_splice()를 사용하여 두 번째 어레이에서 10,000개의 첫 번째 항목을 제거합니다.
  • 두 방법 모두 시간 측정

Dell Latitude i7-6600U 2.60GHz x 4 및 15에서의 상기 스크립트 출력.5 GiB RAM:

php v7.4.8
unset & array_values: 29.089932918549s
array_splice: 17.94264793396s

평가: array_splice는 unset 및 array_values보다 성능이 거의 2배 향상되었습니다.

array_splice가 우승자입니다!

사용 방법:

$foo2 = array_slice($foo, 1);

잠시 후 모든 어레이 요소(불필요한 요소 제외)를 새 어레이에 복사합니다.

언급URL : https://stackoverflow.com/questions/5217721/how-to-remove-array-element-and-then-re-index-array

반응형