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
'developer tip' 카테고리의 다른 글
CocoaPods를 사용할 때 '해당 모듈 없음' (0) | 2020.11.23 |
---|---|
Eclipse / Java-R.string. *의 값은 int를 반환합니까? (0) | 2020.11.23 |
iOS 10 버그 : UICollectionView가 존재하지 않는 인덱스 경로가있는 셀에 대한 레이아웃 속성을 받았습니다. (0) | 2020.11.22 |
뒤로 버튼을 누른 조각에서 활동이 비어 있습니다. (0) | 2020.11.22 |
FragmentManager가 이미 트랜잭션을 실행하고 있습니다. (0) | 2020.11.22 |