我有一个数组让我们假设
$myarr = array(
'1',
'2',
'3',
'4-7',
'9',
'10',
)
$search2 = '2';
$search5 = '5';
我想在我的$myarr
中检查这两个变量。使用in_array
可以很容易地找到第一个,但是$search5
在'4-7‘里面,但是我要做什么来找到这个值呢?我不想要2 foreach,因为我知道我可以使用explode
,然后比较开始值和结束值。是否有单行或双线功能可以帮助我实现我所需要的?谢谢
发布于 2017-04-05 11:21:50
<?php
ini_set("display_errors", 1);
$search=2;
$result=null;
$myarr = array(
'1',
'2',
'3',
'4-7',
'9',
'10',
);
echo search_in_array($myarr,$search);
function search_in_array($myarr,$search)
{
$result=false;
array_map(function($number) use ($myarr,$search, &$result){
if(preg_match("/^(\d+)\-(\d+)$/", $number,$matches))
{
if(in_array($search,range($matches[1],$matches[2])))
{
$result= true;
}
}
elseif(preg_match("/^(\d+)$/", $number,$matches))
{
if(in_array($search,$myarr))
{
$result= true;
}
}
}, $myarr);
return $result;
}
发布于 2017-04-05 11:43:30
另一个答案是:
$myarr = [
'1',
'2',
'3',
'4-7',
'9',
'10',
];
$search2 = '2';
$search5 = '5';
$search12 = '12';
function myInArray($needle, $haystack) {
return in_array(
$needle,
array_reduce(
$haystack,
function($incrementor, $value) {
return array_merge($incrementor, (strpos($value, '-') !== false) ? range(...explode('-', $value)) : [(int)$value]);
},
[]
)
);
}
foreach([$search2, $search5, $search12] as $searchValue) {
echo $searchValue, " is ",(myInArray($searchValue, $myarr) ? '' : 'NOT '), "in the array", PHP_EOL;
}
可能没有那么有效,特别是在$myarr
中处理更大范围的值时,但是方法略有不同。
发布于 2017-04-05 11:45:54
这里几乎只有一条线,
$search = '5';
$matches = explode('-',array_values(preg_grep('/[-]/', $myarr))[0]);
if(in_array($search, $myarr)|| in_array($search,range($matches[0],$matches[1]))){
echo "found";
}else{
echo "not found";
}
我是由-
爆炸,然后用它创建范围,并用in_array检查。
这是工作演示
https://stackoverflow.com/questions/43229443
复制相似问题