27

私はこのような配列を持っています:

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

ここで、その配列を何らかの条件でフィルタリングし、値が 2 に等しい要素のみを保持し、値が 2 でないすべての要素を削除したいと考えています。

したがって、予想される結果配列は次のようになります。

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

注: 元の配列のキーを保持したい。

PHPでそれを行うにはどうすればよいですか?組み込み関数はありますか?

4

9 に答える 9

51
$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";
}
于 2009-10-01T12:13:41.813 に答える
27

何らかの方法で配列をループし、各要素を条件でフィルタリングする必要があります。これは、さまざまな方法で実行できます。

ループwhile/ for/foreachメソッド

whileforまたは など、必要なループを使用して配列をループします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(condition){  //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また、フラグを 3 番目のパラメーターとして渡して、結果を反転できることにも注意してください。

//Filter by values
$newArray = preg_grep("/regex/", $array);

共通条件

配列をフィルタリングするために使用される多くの一般的な条件があり、そのすべてを配列の値やキーに適用できます。ここにそれらのいくつかをリストします。

//Odd values
return $value & 1;

//Even values
return !($value & 1);

//NOT null values
return !is_null($value);

//NOT 0 values
return $value !== 0;

//Contain certain value values
return strpos($value, $needle) !== FALSE;  //Use 'use($needle)' to get the var into scope

//Contain certain substring at position values
return substr($value, $position, $length) === $subString;

//NOT 'empty'(link) values
array_filter($array);  //Leave out the callback parameter
于 2009-10-01T12:13:50.473 に答える
3

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;
    }
}
于 2009-10-01T12:14:00.083 に答える
2

これは機能するはずですが、おそらく大量のデータをコピーすることになるため、どれほど効率的かはわかりません。

$newArray = array_intersect_key(
                  $fullarray, 
                  array_flip(array_keys($fullarray, 2))
            );
于 2009-10-01T13:19:10.177 に答える
0
  foreach ($aray as $key => $value) {
    if (2 != $value) {
      unset($array($key));
    }
  }

  echo 'Items in array:' . count($array);
于 2009-10-01T12:15:47.793 に答える
-1

私は次のようなことをするかもしれません:

$newarray = array();
foreach ($jsonarray as $testelement){
    if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);
于 2009-10-01T12:14:56.147 に答える