동일한 루프에서 배열을 수정하여 Foreach 루프의 배열 교체
문제
foreach($arrayOne as $value){
do function
}
위의 예에서는 $ arrayone을 루프로 전달하고, $ arrayone의 일부 요소를 제거한 다음 루프가 거짓으로 반환 될 때까지 남은 요소에 루프가 감소 된 $ arrayone을 통과하게하는 기능 작동을 원합니다. .
추천?
해결책
배열 항목의 값을 수정하려면 참조로 사용하십시오. 배열 항목을 완전히 제거하려면 키 / 값 쌍을 분할하십시오.
$arrayOne = array('example', 'listing of', 'stuff');
foreach ($arrayOne as $key => &$value) {
$value .= ' alteration';
if ($value == 'listing of alteration') {
unset($arrayOne[ $key ]);
}
}
위의 코드는 배열의 각 항목의 끝에 텍스트 "변경"을 추가합니다. 또한 "변경 목록"과 일치 할 때 두 번째 색인을 제거합니다. PHP 5.2에서 테스트
다른 팁
배열의 일부 요소를 제거하려면 기능이 필요합니까?
그렇다면 사용할 수 있습니다 Array_Filter.
나는 두 개의 배열을 갖는 것이 좋습니다.
데이터가 포함 된 하나 -Datuarray,
다른 하나는 처음에는 비어 있습니다
그리고 첫 번째 ForeachLoop에서 자격이있는 것은 두 번째 배열로 밀고 그 끝에 첫 번째 배열을 비우고 두 배열의 식별자를 교체하고 (DataArray가 빈 알레가되고 그 반대로) false 또는 무엇이든 반복 할 때까지 반복하십시오.
Rabbit은 값 편집 값을 사용하고 INDET을 Foreach 루프에서 UnSet에 대한 인덱스를 사용하는 정답을 가지고 있습니다 (투표 할 것입니다. 그러나 이것은 내 첫 번째 게시물이므로 아직 15 회 반복이 없습니다. 죄송합니다).
참조를 값을 편집하는 데 필요한 함수로 전달하는 경우 참조를 사용해야합니다. 값을 제거하려면 배열을 참조로 전달해야합니다.
더 많은 참조 생성을 방지하기 위해 제거할지 여부에 대한 기능을 반환하는 것이 좋습니다. 예를 들어
foreach ($array AS $key => &$value) {
//& reference only needed if execFunction must edit $value
if (execFunction(&$value)) {
unset($array[$key]);
} else {
$value['exec_failed']+=1;
}
}
unset($value);
또한 $ 값 참조는 루프의 범위를 지나서 지속되므로 트레일 링되지 않습니다.
마지막으로 생각하면 배열을 여러 번 루프하고 싶었던 것처럼 들렸습니다. 루프가 어떻게 실행되는지에주의를 기울이십시오.
도움을 주셔서 감사합니다. Unset () 함수는 결국 오늘날의 특정 요구에 유용한 것입니다. Unset () 사용에 대한 짧은 이야기는 다음과 같습니다.
//array to be processed
$one=array('1','2','3');
//array of terms previously defined as a group to compare against
$against=array('1','2');
foreach($one as $key=>$value){
//pull out matching terms
$match=array_intersect($one,$against);
//my need is to sum grouped numbers
$sum=array_sum($match);
echo $sum."<br />";
//remove matching terms from original array
foreach($match as $key=>$value){
unset($one[$key]);
}
}
//now a parent looping function will process the remaining array elements. In this case, the only one left is '3'.