요소를 설정 해제 한 후 배열 키 리베이스


183

배열이 있습니다.

$array = array(1,2,3,4,5);

배열의 내용을 덤프하면 다음과 같습니다.

array(5) {
  [0] => int(1)
  [1] => int(2)
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}

루프를 반복하고 특정 키를 설정 해제하면 인덱스가 모두 잭업됩니다.

foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    unset($array[$i]);
  }
}

결과적으로 지금 다른 덤프를 수행하면 다음과 같습니다.

array(3) {
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}

배열을 재설정하는 적절한 방법이 있습니까? 요소가 다시 0입니다.

array(3) {
  [0] => int(3)
  [1] => int(4)
  [2] => int(5)
}

답변:


411

이 시도:

$array = array_values($array);

사용 ) (array_values를


6
+1. 매뉴얼에는 주문이 유지 될 것이라고 명시 적으로 명시되어 있지 않지만 왜 그렇지 않을지는 알 수 없습니다.
궤도에서 가벼운 레이스

16
예, 주문이 확실히 유지됩니다. 다시 주문하면 끔찍한 기능이 될 것입니다! :)
webbiedave

1
@webbiedave 죄송 합니다만, 사실이 아닙니다. 실제로 내 배열을 재정렬합니다. 매우 이상합니다.
FooBar

4
항상 쉬운 간결한 해결책을 찾으십시오 :)
Bruce Lim

1
이 방법은 배열에 이미 번호가 매겨진 경우 쉬운 해결책이지만 키가 텍스트로 설정되어 있으면 HTML 양식의 일부처럼 작동하지 않습니다. 양식의 출력을 식별하기 위해 고유 키 값에 의존하는 경우 아래 방법 중 하나가 더 효과적입니다.

17

또 다른 흥미로운 방법이 있습니다.

$array = array('a', 'b', 'c', 'd'); 
unset($array[2]); 

$array = array_merge($array); 

이제 $ array 키가 재설정되었습니다.


13

array_splice대신에 사용하십시오 unset:

$array = array(1,2,3,4,5);
foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    array_splice($array, $i, 1);
  }
}

print_r($array);

작업 샘플은 여기에 있습니다 .


7
작동하지 않습니다. 스플 라이스는 멋지지만 호출 할 때마다 인덱스를 다시 정렬하기 때문에 for / foreach 루프 내에서 사용할 수 없으므로 foreach 루프의 인덱스는 다음 요소를 가리키는 것이 아니라 해당 위치의 요소를 가리 킵니다. 재 배열 된 어레이에서. 예를 들어 값 '3'을 삭제하고 값 '1'과 '2'만 삭제해야 할 때 값 '2'를 남기는 것을 볼 수 있습니다.
NotGaeL

1
@elcodedocle 그런 다음 foreach루프를 사용하지 마십시오 . 표준을 사용하고 i Loop접속 후 간단히 i를 재설정 하십시오 . 또한 Working sample here.작동하지 않습니다.
SpYk3HH

깨진 링크, 고칠 수 있습니까?
Michel Ayres

5

그냥 첨가제.

나는 이것이 오래 되었다는 것을 알고 있지만, 나 자신을 생각해 낸 솔루션을 추가하고 싶었다. 다른 해결책을 찾는 동안이 질문을 발견하고 방금 "내가 여기있는 동안"이라고 생각했습니다.

우선, Neal 의 대답은 루프를 실행 한 후에 사용하기에 좋고 훌륭하지만 모든 작업을 한 번에 수행하는 것이 좋습니다. 물론 특정 경우에는 이 간단한 예제보다 더 많은 작업 을 수행해야 했지만이 방법은 여전히 ​​적용됩니다. 나는 다른 사람들이 foreach고리를 제안하는 것을 보았습니다. 그러나 이것은 짐승의 본성 때문에 여전히 퇴근 후에 떠납니다 . 일반적으로 나는 다음과 같은 간단한 것을 제안 foreach하지만,이 경우 좋은 오래된 for loop논리 를 기억하는 것이 가장 좋습니다 . 간단하게 사용하십시오 i! 적절한 색인을 유지하려면 i배열 항목을 제거 할 때마다 빼십시오 .

여기 내 간단의 작업 예 :

$array = array(1,2,3,4,5);

for ($i = 0; $i < count($array); $i++) {
    if($array[$i] == 1 || $array[$i] == 2) {
        array_splice($array, $i, 1);
        $i--;
    }
}

출력합니다 :

array(3) {
    [0]=> int(3)
    [1]=> int(4)
    [2]=> int(5)
}

이것은 많은 간단한 구현을 가질 수 있습니다. 예를 들어, 정확한 사례는 다차원 값을 기반으로 최신 항목을 배열로 보유해야했습니다. 나는 당신이 의미하는 것을 보여줄 것입니다 :

$files = array(
    array(
        'name' => 'example.zip',
        'size' => '100000000',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '10726556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '110726556',
        'type' => 'application/x-zip-compressed',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example2.zip',
        'size' => '12356556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example2.zip',
        'deleteUrl' => 'server/php/?file=example2.zip',
        'deleteType' => 'DELETE'
    )
);

for ($i = 0; $i < count($files); $i++) {
    if ($i > 0) {
        if (is_array($files[$i-1])) {
            if (!key_exists('name', array_diff($files[$i], $files[$i-1]))) {
                if (!key_exists('url', $files[$i]) && key_exists('url', $files[$i-1])) $files[$i]['url'] = $files[$i-1]['url'];
                $i--;
                array_splice($files, $i, 1);
            }
        }
    }
}

출력합니다 :

array(1) {
    [0]=> array(6) {
            ["name"]=> string(11) "example.zip"
            ["size"]=> string(9) "110726556"
            ["type"]=> string(28) "application/x-zip-compressed"
            ["deleteUrl"]=> string(28) "server/php/?file=example.zip"
            ["deleteType"]=> string(6) "DELETE"
            ["url"]=> string(44) "28188b90db990f5c5f75eb960a643b96/example.zip"
        }
    [1]=> array(6) {
            ["name"]=> string(11) "example2.zip"
            ["size"]=> string(9) "12356556"
            ["type"]=> string(28) "application/x-zip-compressed"
            ["deleteUrl"]=> string(28) "server/php/?file=example2.zip"
            ["deleteType"]=> string(6) "DELETE"
            ["url"]=> string(45) "28188b90db990f5c5f75eb960a643b96/example2.zip"
        }
}

보시다시피, 나는 현재 항목이 아닌 이전 항목을 제거하려고 할 때 스플 라이스 전에 $ i를 조작합니다.


1

늦은 답변이지만 PHP 5.3 이후는 그렇게 될 수 있습니다.

$array = array(1, 2, 3, 4, 5);
$array = array_values(array_filter($array, function($v) {
    return !($v == 1 || $v == 2);
}));
print_r($array);

1

또는 참조로 배열을 전달하는 자체 함수를 만들 수 있습니다.

function array_unset($unsets, &$array) {
  foreach ($array as $key => $value) {
    foreach ($unsets as $unset) {
      if ($value == $unset) {
        unset($array[$key]);
        break;
      }
    }
  }
  $array = array_values($array);
}

그럼 당신이해야 할 일은 ...

$unsets = array(1,2);
array_unset($unsets, $array);

... 이제 당신 $array의 가치가 없으며 $unsets키가 재설정됩니다.


1

나를 위해 일하는 100 %! 배열에서 요소를 설정 해제 한 후 배열을 다시 색인화하는 데 사용할 수 있습니다

$result=array_combine(range(1, count($your_array)), array_values($your_array));

0

$arr = array_merge($arr); 배열을 리베이스하는 데 사용 합니다. 간단하고 간단합니다.


-2

내 상황에서는 배열 값으로 고유 키를 유지해야했기 때문에 두 번째 배열을 사용했습니다.

$arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot");
unset($arr1);

$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);

1) unset($arr1)루프에서 반복 할 수없는 사용자. 2) 마지막 줄에서 세미콜론이 누락되었습니다. 이 코드 스 니펫은 실행되지 않습니다.
Rockin4Life33
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.