我只想使用1个foreach

时间:2017-04-05 11:08:48

标签: php arrays

我有一个数组让我们假设

$myarr = array(
    '1',
    '2',
    '3',
    '4-7',
    '9',
    '10',
)

$search2 = '2';
$search5 = '5';

我想检查$myarr中的这两个变量。使用in_array可以轻松找到第一个,但$search5位于内部' 4-7'但我该怎么做才能找到价值呢?我不想要2个foreach 因为我知道我可以使用explode然后比较开始值和结束值。是否有单线或双线功能可以帮助我实现我的需求?感谢

9 个答案:

答案 0 :(得分:2)

PHP code demo

<?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;
}

答案 1 :(得分:2)

正如另一个答案:

$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中处理较大范围的值时,但方法略有不同

Demo

答案 2 :(得分:2)

这几乎是单行,

 Picasso.with(getActivity()).load(fileUri).into(imageView);

我正在$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检查它。

这是有效的DEMO

答案 3 :(得分:0)

尝试使用以下代码:

$myarr = array('1','2','3','4-7','9','10');

$search = 1;        // Try with 5 

$flag1 = false;
foreach($myarr as $number){
    if(!is_numeric($number)){
        list($start,$end) = explode("-",$number);
        if($search >=$start && $search <=$end ){
            echo $search .' Found';
        }
    }else if($flag1 == false){
       if(in_array($search,$myarr)){
           echo $search .' Found';
           $flag1 = true;
       }
    }
}

Working Demo

答案 4 :(得分:0)

<?php

$myarr = ['1', '2', '3', '4-7', '9', '10'];
$search_array = [2, 5];
$search_results = [];
for ($i = 0; $i < count($search_array); $i++) {
    $search_results[$search_array[$i]] = array_search($search_array[$i], $myarr);
    if (!$search_results[$search_array[$i]]) {
        foreach ($myarr as $value) {
            if (strpos($value, "-") !== false) {
                $data = explode("-", $value);
                if ($search_array[$i] >= $data[0] && $search_array[$i] <= $data[1]) {
                    $search_results[$search_array[$i]] = array_search($value, $myarr);
                }
            }
        }
    }
    if (!$search_results[$search_array[$i]]) {
        unset($search_results[$search_array[$i]]);
    }
}
var_dump($search_results);

显然使用单个foreach我用这个代码来查找...另一组数据是for循环而不是foreach。

答案 5 :(得分:0)

@Ali Zia您也可以尝试以下逻辑:

<?php
    $myarr = array(
    '1',
    '2',
    '3',
    '4-7',
    '9',
    '10',
    );
    $flag = 0;
    $search = '5';

    foreach($myarr as $value){
        if($value == $search){
            $flag = 1;
            break;
        }
        else if(strpos($value, "-")){
            $numberRange = explode("-", $value);
            if($numberRange[0] <= $search && $numberRange[1] >= $search){
                $flag = 1;
                break;
            }
        }
    }

    if($flag == 1){
        echo "yes number found in the array";
    }
    else{
         echo "sorry not found";
    }

答案 6 :(得分:0)

只是为了使用range()和参数解包,因为没有其他答案可以做到:

function in_array_range($needle, array $haystack) {
    if (in_array((int) $needle, $haystack, true)) {
        return true;
    }

    $haystack = array_map(
        function($element) {
            return strpos($element, '-')
                ? range(... explode('-', $element, 2))
                : (int) $element;
        },
        $haystack
    );

    foreach ($haystack as $element) {
        if (is_array($element) && in_array((int) $needle, $element, true)) {
            return true;
        }
    }

    return false;
}

答案 7 :(得分:0)

如果找不到这样的元素,下面的函数会返回$needle$haystack中的-1索引。

function find(array $haystack, $needle) {
    for ($i = 0; $i < count($haystack); $i++) {
        $parts = explode("-", $haystack[$i]);
        if (count($parts) == 2) {
            if ($needle >= $parts[0] && $needle <= $parts[1]) {
                return $i;
            }
        }
        else if ($needle == $parts[0]) {
            return $i;
        }
    }
    return -1;
}

该函数假定$array仅包含一个由负划分隔的单个非负整数或两个非负整数。

您现在可以收集这样的索引:

$indices = array();
foreach ($searchValues as $searchValue) {
    $indices[] = find($myarr, $searchValue);
}

答案 8 :(得分:0)

我知道答案已被接受,但这是我的方法w / o没有使用foreach。

See demo)。

用foreach:

<?php
$value = 3;
    foreach($myarr as $myval){
    list($start, $end) = strpos($myval, '-') ? explode('-', $myval) : [$myval, $myval];
    if($value >= $start && $value <= $end){
        echo $value . ' found between "' . $start . '" & "' . $end . '" !' . "\n";
    }
}

没有foreach,“一行”代码:

<?php
$value = 5;
$trueValues =  [1,5];
$falseValues = [5, 7, 8];
var_dump(!count(array_diff($trueValues,array_reduce($myarr,function($arr, $item){return $arr + (strpos($item, '-') ? range(...explode('-', $item)) : [$item]);},[]))));
var_dump(!count(array_diff($falseValues,array_reduce($myarr,function($arr, $item){return $arr + (strpos($item, '-') ? range(...explode('-', $item)) : [$item]);},[]))));
var_dump(in_array($value, array_reduce($myarr, function($arr, $item){return $arr + (strpos($item, '-') ? range(...explode('-', $item)) : [$item]);}, array())));

展开:

<?php
var_dump(
    !count(
        array_diff(
            $trueValues,
            array_reduce(
                $myarr,
                function($arr, $item){
                    return $arr + (strpos($item, '-') ? range(...explode('-', $item)) : [$item]);
                },
                []
            )
        )
    )
);
编辑:不知道省略号操作符,谢谢@Mark Ba​​ker