我有一个像这样的数组:

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))
            );

我认为snappiest,可读内置函数是: array_intersect()

编码:(演示

$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