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 )