PHP는 연관 배열에서 요소를 제거


100

다음과 같은 PHP 배열이 있습니다.

Index              Key     Value
[0]                1       Awaiting for Confirmation
[1]                2       Assigned
[2]                3       In Progress
[3]                4       Completed
[4]                5       Mark As Spam

내가 var_dump 배열 값을 얻을 때 나는 이것을 얻는다 :

array(5) { [0]=> array(2) { ["key"]=> string(1) "1" ["value"]=> string(25) "Awaiting for Confirmation" } [1]=> array(2) { ["key"]=> string(1) "2" ["value"]=> string(9) "Assigned" } [2]=> array(2) { ["key"]=> string(1) "3" ["value"]=> string(11) "In Progress" } [3]=> array(2) { ["key"]=> string(1) "4" ["value"]=> string(9) "Completed" } [4]=> array(2) { ["key"]=> string(1) "5" ["value"]=> string(12) "Mark As Spam" } }

완료 됨스팸으로 표시 를 제거 하고 싶었습니다 . 나는 할 수 있다는 것을 알고 unset[$array[3],$array[4])있지만 문제는 때때로 색인 번호가 다를 수 있다는 것입니다.

키 값 대신 값 이름을 일치시켜 제거하는 방법이 있습니까?


내가 여기서 당면한 질문을 이해하는지 확실하지 않습니까? 때때로 색인 번호가 다를 수 있다는 것은 무엇을 의미합니까?
Simon H

답변:


153

배열이 매우 이상합니다. as 인덱스와 as ... 값을 사용하지 않는 이유 는 무엇입니까?keyvalue

배열이 다음과 같이 선언 되었다면 훨씬 쉬울까요?

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);

그러면의 값을 key인덱스로 사용하여 배열에 액세스 할 수 있습니다.

그리고 다음과 같은 함수를 사용하여 값을 검색 할 수 있습니다 array_search().

$indexCompleted = array_search('Completed', $array);
unset($array[$indexCompleted]);

$indexSpam = array_search('Mark As Spam', $array);
unset($array[$indexSpam]);

var_dump($array);

어레이보다 더 쉽습니다.



대신 다음과 같은 배열을 사용하십시오.

$array = array(
    array('key' => 1, 'value' => 'Awaiting for Confirmation'), 
    array('key' => 2, 'value' => 'Asssigned'), 
    array('key' => 3, 'value' => 'In Progress'), 
    array('key' => 4, 'value' => 'Completed'), 
    array('key' => 5, 'value' => 'Mark As Spam'), 
);

모든 항목을 반복 value하고을 분석 하고 올바른 항목을 설정 해제해야합니다.

foreach ($array as $index => $data) {
    if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
        unset($array[$index]);
    }
}
var_dump($array);

할 수 있더라도 그렇게 간단하지 않습니다 ... 그리고 저는 주장합니다 : 더 간단한 키 / 값 시스템으로 작업하기 위해 배열의 형식을 변경할 수 없습니까?


"값을 분석하려면 모든 항목을 반복해야합니다." array_search를 사용하는 경우 모든 항목을 검색 할 수도 있습니다.
Nicolas Aoki

96
  ...

  $array = array(
      1 => 'Awaiting for Confirmation', 
      2 => 'Asssigned', 
      3 => 'In Progress', 
      4 => 'Completed', 
      5 => 'Mark As Spam', 
  );



  return array_values($array);
  ...

3
고마워요, 이걸 찾고 있었어요.! :)
Ravi Dhoriya ツ

2
좋고 쉽습니다. 그냥이를 찾고
파이잘 Mehmood 아완

이것은 확인 된 것이 아니라 정답입니다.
A.Seddighi

16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

2D 배열의 경우 ...

$remove = array("Mark As Spam", "Completed");
foreach($arrays as $array){
    foreach($array as $key => $value){
        if(in_array($value, $remove)) unset($array[$key]);
    }
}


3

array_diff를 사용하지 않는 이유는 무엇입니까?

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$to_delete = array('Completed', 'Mark As Spam');
$array = array_diff($array, $to_delete);

배열이 다시 인덱싱된다는 점에 유의하십시오.


1

이 시도:

$keys = array_keys($array, "Completed");

/ edit JohnP에서 언급했듯이이 방법은 비 중첩 배열에서만 작동합니다.


0

이를 수행하는 방법은 중첩 된 대상 배열을 가져 와서 단일 단계로 중첩되지 않은 배열에 복사하는 것입니다. 키를 삭제 한 다음 마지막으로 트리밍 된 배열을 이전 배열의 중첩 노드에 할당합니다. 다음은 간단하게 만드는 코드입니다.

$temp_array = $list['resultset'][0];

unset($temp_array['badkey1']);
unset($temp_array['badkey2']);

$list['resultset'][0] = $temp_array;

0

나는 받아 들인 대답에 약간 동의하지 않습니다. 때로는 응용 프로그램 아키텍처가 배열 ID를 엉망으로 만들고 싶지 않거나 불편하게 만듭니다. 예를 들어 저는 CakePHP를 많이 사용하고 데이터베이스 쿼리는 위와 매우 유사한 각 레코드의 값으로 기본 키를 반환합니다.

배열이 어리석게 크지 않다고 가정하면 array_filter를 사용합니다. 이렇게하면 제거 할 레코드를 뺀 배열의 복사본이 만들어지며 원래 배열 변수에 다시 할당 할 수 있습니다.

이것이 비효율적으로 보일 수 있지만, 요즘에는 변수가 불변하는 것이 유행하고 있으며, 대부분의 PHP 배열 함수가 원본과 섞이지 않고 새로운 배열을 반환한다는 사실은 PHP가이 작업을 수행하기를 원한다는 것을 의미합니다. 그리고 배열을 더 많이 사용하고 unset () 함수가 얼마나 어렵고 성가 신지 깨달을수록이 접근 방식은 많은 의미가 있습니다.

어쨌든:

$my_array = array_filter($my_array, 
                         function($el) { 
                            return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                         });

원하는 포함 된 함수에 포함 논리 (예 : id 필드)를 사용할 수 있습니다.


-1

단일 배열 항목 사용 reset($item)


reset 함수는 배열에서 항목을 제거하거나 항목을 설정 해제하는 것이 아니라 내부 배열 포인터를 이동하는 데 사용해야합니다. 대신 unset을 사용하십시오. 솔루션이 작동하는 경우에도 원치 않는 부작용이 있습니다.
David
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.