문제

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

array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2)

이제 특정 조건에 따라 해당 배열을 필터링하고 값이 2인 요소만 유지하고 값이 2가 아닌 모든 요소를 ​​삭제하고 싶습니다.

따라서 예상되는 결과 배열은 다음과 같습니다.

array("a" => 2, "c" => 2, "f" => 2)

메모:원래 배열의 키를 유지하고 싶습니다.

PHP로 어떻게 할 수 있나요?내장된 기능이 있나요?

도움이 되었습니까?

해결책

$fullarray = array('a'=>2,'b'=>4,'c'=>2,'d'=>5,'e'=>6,'f'=>2);


function filterArray($value){
    return ($value == 2);
}

$filteredArray = array_filter($fullArray, 'filterArray');

foreach($filteredArray as $k => $v){
    echo "$k = $v";
}

다른 팁

어떻게든 배열을 반복하고 조건에 따라 각 요소를 필터링해야 합니다.이는 다양한 방법으로 수행할 수 있습니다.

루프 while / for / foreach 방법

원하는 루프로 배열을 반복하십시오. while, for 또는 foreach.그런 다음 귀하의 상태를 확인하고 다음 중 하나를 수행하십시오. unset() 조건을 충족하지 않는 경우 요소를 삭제하거나 조건을 충족하는 요소를 새 배열에 씁니다.

루핑

//while loop
while(list($key, $value) = each($array)){
    //condition
}

//for loop
$keys = array_keys($array);
for($counter = 0, $length = count($array); $counter < $length; $counter++){
    $key = $keys[$counter];
    $value = $array[$key];
    //condition 
}

//foreach loop
foreach($array as $key => $value){
    //condition
}

상태

주석이 있는 루프에 조건을 넣기만 하면 됩니다. //condition 이다.조건은 원하는 것을 확인한 다음 다음 중 하나를 수행할 수 있습니다. unset() 조건을 충족하지 않는 요소를 제거하고 배열을 다시 인덱싱합니다. array_values() 원하는 경우 조건을 충족하는 새 배열에 요소를 작성하십시오.

//Pseudo code
//Use one of the two ways
if(상태){  //1. Condition fulfilled
    $newArray[ ] = $value;
            //↑ Put '$key' there, if you want to keep the original keys
            //Result array is: $newArray

} else {        //2. Condition NOT fulfilled
    unset($array[$key]);
    //Use array_values() after the loop if you want to reindex the array
    //Result array is: $array
}

array_filter() 방법

또 다른 방법은 array_filter() 내장 기능.일반적으로 간단한 루프를 사용하는 방법과 거의 동일하게 작동합니다.

넌 그냥 돌아가면 돼 TRUE 배열의 요소를 유지하고 싶다면 FALSE 결과 배열에서 요소를 삭제하려는 경우.

//Anonymous function
$newArray = array_filter($array, function($value, $key){
    //condition
}, ARRAY_FILTER_USE_BOTH);

//Function name passed as string
function filter($value, $key){
    //condition
}
$newArray = array_filter($array, "filter", ARRAY_FILTER_USE_BOTH);

//'create_function()', NOT recommended
$newArray = array_filter($array, create_function('$value, $key', '/* condition */'), ARRAY_FILTER_USE_BOTH);

preg_grep() 방법

preg_grep() ~와 비슷하다 array_filter() 단지 정규식만 사용하여 배열을 필터링한다는 점입니다.따라서 정규 표현식만 필터로 사용할 수 있고 값이나 키별로 더 많은 코드를 사용하여 필터링할 수 있으므로 모든 작업을 수행하지 못할 수도 있습니다.

또한 플래그를 전달할 수 있습니다. PREG_GREP_INVERT 결과를 반전시키기 위한 세 번째 매개변수입니다.

//Filter by values
$newArray = preg_grep("/정규식/", $array);

일반적인 조건

배열을 필터링하는 데 사용되는 일반적인 조건이 많이 있으며, 그 조건은 모두 배열의 값 및/또는 키에 적용될 수 있습니다.여기에 그 중 몇 가지만 나열하겠습니다.

//홀수 값
return $value & 1;

//짝수 값
return !($value & 1);

//널값이 아님
return !is_null($value);

//0 값이 아님
return $value !== 0;

//특정 값 값을 포함합니다.
return strpos($value, $needle) !== FALSE;  //Use 'use($needle)' to get the var into scope

//위치 값에 특정 하위 문자열 포함
return substr($value, $position, $length) === $subString;

//아니다 '비어있음'(링크) 가치
array_filter($array);  //Leave out the callback parameter

사용할 수 있도록 키 복사본을 반복할 수 있습니다. unset() 루프에서 :

foreach (array_keys($array) as $key) {
    if ($array[$key] != 2)  {
        unset($array[$key]);
    }
}

이 방법의 장점은 배열에 큰 값이 포함된 경우 메모리 효율성입니다. 즉, 중복되지 않습니다.

편집하다 실제로는 값이 2인 키만 필요하다는 것을 방금 확인했습니다(이미 값을 알고 있음).

$keys = array();
foreach ($array as $key => $value) {
    if ($value == 2)  {
        $keys[] = $key;
    }
}

이 방법은 효과가 있지만 결국 많은 양의 데이터를 복사하게 되므로 얼마나 효율적인지 잘 모르겠습니다.

$newArray = array_intersect_key(
                  $fullarray, 
                  array_flip(array_keys($fullarray, 2))
            );

내 생각에 가장 빠르고 읽기 쉬운 내장 함수는 다음과 같습니다. 배열_교차()

암호:(데모)

$array = array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2);
var_export(array_intersect($array, [2]));

산출:

array (
  'a' => 2,
  'c' => 2,
  'f' => 2,
)

두 번째 매개변수가 예상되는 값 유형이므로 배열로 선언했는지 확인하세요.

이제 foreach 루프를 작성하거나 다음을 사용하는 데 아무런 문제가 없습니다. array_filter(), 그들은 더 장황한 구문을 가지고 있습니다.

array_intersect() 또한 두 번째 매개변수 배열에 더 많은 값을 추가하여 확장하기가 매우 쉽습니다(추가 "적격" 값 포함).

  foreach ($aray as $key => $value) {
    if (2 != $value) {
      unset($array($key));
    }
  }

  echo 'Items in array:' . count($array);

나는 다음과 같은 일을 할 수 있습니다 :

$newarray = array();
foreach ($jsonarray as $testelement){
    if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top