array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2)
现在我想按某种条件过滤该数组,只保留值等于2的元素并删除所有元素其中值不是2。
所以我的预期结果数组将是:
array("a" => 2, "c" => 2, "f" => 2)
注意:我想保留键原始数组。
如何用PHP做到这一点?有内置功能吗?
#1 楼
$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";
}
评论
要求为每个请求设置不同的功能...是否可以设置额外的var? (2作为变量)
–menardmam
09年10月1日在15:28
最好更新此答案以使用闭包,以在2019年教授最佳实践!
–本杰明
19年1月17日在17:08
#2 楼
您必须以某种方式遍历数组并根据您的条件过滤每个元素。这可以通过各种方法来实现。循环
while
/ for
/ foreach
方法循环遍历数组并带有所需的任何循环,可以是
while
,for
或foreach
。然后只需检查您的条件,然后检查是否满足条件,或者将满足条件的元素写到新数组中。循环
//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
}
条件
只需将您的条件放入注释
unset()
所在的循环中即可。条件可以只检查您想要的内容,然后可以//condition
不满足条件的元素,并根据需要用unset()
重新索引数组,或者将满足条件的元素写入新数组。//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_values()
方法另一种方法是使用
array_filter()
内置函数。通常,它的工作原理与带有简单循环的方法几乎相同。如果要将元素保留在数组中,只需返回
array_filter()
;如果要将元素从数组中删除,则只需返回TRUE
。结果数组。//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);
FALSE
方法preg_grep()
与preg_grep()
类似,只是它仅使用正则表达式来过滤数组。因此,您可能无法使用它做任何事情,因为您只能使用正则表达式作为筛选器,并且只能按值或按键使用更多代码进行筛选。还请注意,您可以将标志
array_filter()
作为第三个参数传递来反转结果。 //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
评论
它不会通过引用传递$ arr,而是返回一个您没有捕获的新数组。
–西蒙
09年10月1日在12:16
@Simon:该手册不仅适用于书虫。所有开发人员都应该有足够的能力和智慧来阅读它。但是,也许大多数人都希望他们不必考虑复制粘贴示例。
–浓汤
09年10月1日于13:23
#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;
}
}
#4 楼
这应该可以工作,但是我不确定它的效率如何,因为您可能最终会复制大量数据。$newArray = array_intersect_key(
$fullarray,
array_flip(array_keys($fullarray, 2))
);
#5 楼
我认为最快,最易读的内置函数是: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,
)
请确保将第二个参数声明为数组,因为这是预期的值类型。
现在写出a并没有错。 foreach循环,或使用
array_filter()
,它们只是语法更加冗长。array_intersect()
也很容易扩展(通过向第二个参数数组添加更多值来扩展(包括其他“限定”值)。 />#6 楼
foreach ($aray as $key => $value) {
if (2 != $value) {
unset($array($key));
}
}
echo 'Items in array:' . count($array);
#7 楼
我可能会做类似的事情:$newarray = array();
foreach ($jsonarray as $testelement){
if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);
评论
在array_filter页面上查看示例。