Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按条件筛选数组_Php_Arrays_Filter_Higher Order Functions - Fatal编程技术网

Php 如何按条件筛选数组

Php 如何按条件筛选数组,php,arrays,filter,higher-order-functions,Php,Arrays,Filter,Higher Order Functions,我有这样一个数组: array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2) 现在,我想通过某种条件过滤该数组,只保留值等于2的元素,并删除值不等于2的所有元素 因此,我的预期结果是: array("a" => 2, "c" => 2, "f" => 2) 注意:我想保留原始数组中的键 如何使用PHP实现这一点?任何内置函数?您必须以某种方式在数组中循环,并根据您的

我有这样一个数组:

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
。然后简单地检查您的条件,如果元素不满足您的条件,则检查元素,或者将满足条件的元素写入一个新数组

循环 方法 另一种方法是使用
array\u 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\u grep()
array\u filter()
类似,只是它只使用正则表达式过滤数组。因此,您可能无法使用它完成所有操作,因为您只能使用正则表达式作为过滤器,并且只能按值或按键使用更多代码进行过滤

还请注意,您可以将标志
PREG\u GREP\u INVERT
作为第三个参数传递,以反转结果

//Filter by values
$newArray = preg_grep("/regex/", $array);
//按值筛选
$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
//奇数值
返回$value&1;
//偶数值
回来!($value&1);
//非空值
回来!为空($value);
//不是0个值
返回$value!==0;
//包含某些值
返回strpos($value,$needle)!=虚假的//使用“Use($needle)”将var引入范围
//在位置值处包含某些子字符串
返回substr($value、$position、$length)==$subString;
//不是价值观
阵列滤波器($array)//省略回调参数

您可以迭代键的副本,以便能够在循环中使用
unset()

foreach (array_keys($array) as $key) {
    if ($array[$key] != 2)  {
        unset($array[$key]);
    }
}
这种方法的优点是,如果您的数组包含大的值,那么内存效率会很高—这些值不会重复

编辑我刚刚注意到,实际上您只需要值为2的键(您已经知道该值):


我可能会这样做:

$newarray = array();
foreach ($jsonarray as $testelement){
    if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);

这应该是可行的,但我不确定它的效率有多高,因为您可能会复制大量数据

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

我认为最简洁易读的内置函数是:

代码:()

输出:

array (
  'a' => 2,
  'c' => 2,
  'f' => 2,
)
只需确保将第二个参数声明为数组,因为这是所需的值类型

现在写一个foreach循环,或者使用
array\u filter()
,没有什么错,它们只是有一个更详细的语法


array\u intersect()
也很容易通过向第二个参数数组添加更多值来扩展(包括其他“限定”值)。

这可以使用闭包来处理。以下答案的灵感来自:

$filtered_数组的内容现在将是

array ( ["a"] => 2 ["c"] => 2 ["f"] => 2 ) 

它不会通过引用传递$arr,而是返回一个新的数组,您没有捕获该数组。@Simon:该手册不仅仅针对书籍蠕虫。所有开发人员都应该能够并且足够聪明地阅读它。但也许大多数人都希望有一个复制粘贴的例子,这样他们就不必思考了。。。有可能增加一个var吗?(2作为变量)最好更新这个答案,使用闭包,在2019年教授最佳实践!请查看页面上的示例。与其从另一个源代码逐字复制,不如将您的代码改编为该问题的答案,以便它能够回答该问题。@FrankPl感谢您的建议。我已经编辑了我的答案。
  foreach ($aray as $key => $value) {
    if (2 != $value) {
      unset($array($key));
    }
  }

  echo 'Items in array:' . count($array);
$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,
)
//This will create an anonymous function that will filter the items in the array by the value supplied
function cb_equal_to($val)
{
    return function($item) use ($val) {
        return $item == $val;
    };
}

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

// Use array_filter on a input with a selected filter function
$filtered_array = array_filter($input, cb_equal_to(2));
array ( ["a"] => 2 ["c"] => 2 ["f"] => 2 )