developer tip

foreach 루프에서 배열 값 설정 해제

copycodes 2020. 11. 23. 08:18
반응형

foreach 루프에서 배열 값 설정 해제


이 질문에 이미 답변이 있습니다.

내 배열을 통과하고 특정 링크를 확인하고 발견하면 배열에서 해당 링크를 제거하도록 설정된 foreach 루프가 있습니다.

내 코드 :

foreach($images as $image)
{
    if($image == 'http://i27.tinypic.com/29yk345.gif' ||
    $image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
    $image == 'http://i42.tinypic.com/9pp2456x.gif')
    {
        unset($images[$image]);
    }
}

그러나 어레이 전체를 제거하지는 않습니다. 그것은 $images[$image]배열 항목의 키가 아니라 내용 만 있기 때문에 아마도와 관련이 있습니까? 카운터를 통합하지 않고이를 수행 할 수있는 방법이 있습니까?

감사.

편집 : 고마워요,하지만 이제 배열 항목이 실제로 삭제되지 않는 또 다른 문제가 있습니다.

내 새 코드 :

foreach($images[1] as $key => $image)
{
    if($image == 'http://i27.tinypic.com/29yk345.gif')
    $image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
    $image == 'http://i42.tinypic.com/9pp2456x.gif')
    {
        unset($images[$key]);
    }
}

$ images는 실제로 2 차원 배열이므로 $ images [1]이 필요합니다. 나는 확인했고 그것은 성공적으로 배열 요소를 돌아 다니며 일부 요소에는 실제로 삭제하려는 URL 중 일부가 있지만 삭제되지는 않습니다. 이것은 내 $images배열입니다.

Array
(
    [0] => Array
        (
            [0] => useless
            [1] => useless
            [2] => useless
            [3] => useless
            [4] => useless
        )

    [1] => Array
        (
            [0] => http://i27.tinypic.com/29yk345.gif
            [1] => http://img3.abload.de/img/10nx2340fhco.gif
            [2] => http://img3.abload.de/img/10nx2340fhco.gif
            [3] => http://i42.tinypic.com/9pp2456x.gif
        )

)

감사!


foreach($images as $key => $image)
{
    if(in_array($image, array(
       'http://i27.tinypic.com/29ykt1f.gif',
       'http://img3.abload.de/img/10nxjl0fhco.gif',
       'http://i42.tinypic.com/9pp2tx.gif',
    ))
    {
        unset($images[$key]);
    }
}

시도해보십시오.

foreach ($images as $key => &$image) {
    if (yourConditionGoesHere) {
        unset($images[$key])
    }
}

일반적으로 foreach는 배열의 복사본에서 작동하므로 변경 사항은 해당 복사본에 적용되며 실제 배열에는 영향을주지 않습니다.

따라서 $ images [$ key]를 통해 값을 설정 해제해야합니다.

& $ image에 대한 참조는 루프가 메모리를 낭비하는 배열의 복사본을 만드는 것을 방지합니다.


편집 후 초기 질문에 답하려면 unset ($ images [1] [$ key]);

이제 PHP가 작동하는 방법에 대한 추가 정보 : foreach 루프에서 배열의 요소를 안전하게 해제 할 수 있으며 배열 항목에 대해 &가 있는지 여부는 중요하지 않습니다. 이 코드를 참조하십시오.

$a=[1,2,3,4,5];
foreach($a as $key=>$val)
{
   if ($key==3) unset($a[$key]);
}
print_r($a);

이것은 다음을 인쇄합니다.

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [4] => 5
)

보시다시피 foreach 루프 내에서 올바른 설정을 해제하면 모든 것이 잘 작동합니다.


$image귀하의 경우에는 열쇠가 아니라 항목의 가치입니다. 다음 구문을 사용하여 키도 가져옵니다.

foreach ($images as $key => $value) {
    /* … */
}

이제를 사용하여 항목을 삭제할 수 있습니다 unset($images[$key]).


배열 요소의 인덱스를 사용하여 배열에서 제거 할 수 있습니다. 다음에 $list변수 를 사용할 때 배열이 변경된 것을 볼 수 있습니다.

이런 식으로 시도

foreach($list as $itemIndex => &$item) {

   if($item['status'] === false) {
      unset($list[itemIndex]);
   }

}

당신은 또한 필요합니다

$i--;

요소를 건너 뛰지 않도록 설정 해제 한 후

Because when you unset $item[45], the next element in the for-loop should be $item[45] - which was [46] before unsetting. If you would not do this, you'd always skip an element after unsetting.


One solution would be to use the key of your items to remove them -- you can both the keys and the values, when looping using foreach.

For instance :

$arr = array(
    'a' => 123,
    'b' => 456,
    'c' => 789, 
);

foreach ($arr as $key => $item) {
    if ($item == 456) {
        unset($arr[$key]);
    }
}

var_dump($arr);

Will give you this array, in the end :

array
  'a' => int 123
  'c' => int 789


Which means that, in your case, something like this should do the trick :

foreach($images as $key => $image)
{
    if($image == 'http://i27.tinypic.com/29yk345.gif' ||
    $image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
    $image == 'http://i42.tinypic.com/9pp2456x.gif')
    {
        unset($images[$key]);
    }
}


foreach($images as $key=>$image)                                
{               
   if($image == 'http://i27.tinypic.com/29ykt1f.gif' ||    
   $image == 'http://img3.abload.de/img/10nxjl0fhco.gif' ||    
   $image == 'http://i42.tinypic.com/9pp2tx.gif')     
   { unset($images[$key]); }                               
}

!!foreach($images as $key=>$image

cause $image is the value, so $images[$image] make no sense.


Sorry for the late response, I recently had the same problem with PHP and found out that when working with arrays that do not use $key => $value structure, when using the foreach loop you actual copy the value of the position on the loop variable, in this case $image. Try using this code and it will fix your problem.

for ($i=0; $i < count($images[1]); $i++)
{

    if($images[1][$i] == 'http://i27.tinypic.com/29yk345.gif' ||

    $images[1][$i] == 'http://img3.abload.de/img/10nx2340fhco.gif' ||

    $images[1][$i] == 'http://i42.tinypic.com/9pp2456x.gif')

    {

        unset($images[1][$i]);

    }

}

var_dump($images);die();

참고URL : https://stackoverflow.com/questions/2008866/unsetting-array-values-in-a-foreach-loop

반응형