如何搜索数组

时间:2018-05-14 20:03:36

标签: php arrays comparison

我需要在数组中以数字组合搜索和打印所有匹配输入数字。

我的数组看起来像这样:

$ar = ['01-05-24-30-35-36', '25-27-32-34-37-42', '11-17-18-22-33-41'];

以下是输入和逻辑:

鉴于A: 01-05-24-30-35-36 (是的,因为它匹配数组[0]上的确切组合数字)

鉴于B: 05-30-01-36-35-24 (是的,因为给定的6个数字都存在于数组[0],不同的数字位置)

鉴于C: 01-05-24-30-35-33 (错误,因为给定的6个数字不存在于数组中的一个数字组合中,即使第一个存在5个数字,但最后一个(33)不存在,那么它将变为假)

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

这是@ Sammitch的优秀建议的实现:

<?php

$ar = ['01-05-24-30-35-36', '25-27-32-34-37-42', '11-17-18-22-33-41'];

function doesItMatch($arg1) {
    global $ar;

    $in = $arg1;

    $inA = explode("-", $in);
    sort($inA);
    $inB = implode("-", $inA);

    foreach ($ar as $elem) {
        if ($elem == $inB) {
            echo("found match for $arg1 : $elem\n");
            return;
        }
    }

    echo("found NO match for $arg1 !!!\n");
}

doesItMatch("01-05-24-30-35-36");
doesItMatch("05-30-01-36-35-24");
doesItMatch("01-05-24-30-35-33");

?>

输出:

found match for 01-05-24-30-35-36 : 01-05-24-30-35-36
found match for 05-30-01-36-35-24 : 01-05-24-30-35-36
found NO match for 01-05-24-30-35-33 !!!

根据需要调整您的整体代码。

答案 1 :(得分:1)

我只是添加它,因为它是我已经拥有的代码,它可以满足您的需求。我认为它比其他答案更具通用性。

这可以查找:

  • 字符串
  • 的字符串
  • 针对字符串数组的字符串
  • 针对另一个字符串数组的字符串数组
  • 针对字符串的字符串数组。

它返回一个数组,其中你的针作为键,而真或假的值取决于它是否已找到。

如果除了破折号之外还需要别的东西,可以添加第三个参数来更改分隔符。

<?php 
$ar = ['01-05-24-30-35-36', '25-27-32-34-37-42', '11-17-18-22-33-41'];
$ar2 = ['01-05-24-30-35-36', '05-30-01-36-35-24', '01-05-24-30-35-33'];
var_dump(sortAndMatch($ar2, $ar));
/*
 * array (size=3)
 *     '01-05-24-30-35-36' => boolean true
 *     '05-30-01-36-35-24' => boolean true
 *     '01-05-24-30-35-33' => boolean false
 */


/*
 * Sort 2 strings or arrays of strings and try to find $needles into $haystack.
 * Returns array($needle => bool);
 * $array[$needle] is true when it's found.
 * $array[$needle] is false when it isn't.
 */
function sortAndMatch($needles, $haystack, $delimiter = '-'){
    //Sort haystack
    foreach ((array)$haystack as $k => $combination){
        $haystack[$k] = explode($delimiter, $combination);
        sort($haystack[$k]);
    }
    //Sort and compare needles, builds $results
    foreach((array)$needles as $k => $needle){
        $needle= explode($delimiter, $needle);
        sort($needle);
        $results[$needles[$k]] = false;
        if(array_search($needle, $haystack) !== false){
            $results[$needles[$k]] = true;
        }
    }
    return $results;
}

答案 2 :(得分:0)

您的 haystack 数字集已经排序,因此可以保持不变。

在检查 haystack 字符串之前,您只需要爆炸,排序和重新加载 needle 号码(这是in_array()的用途)。< / p>

代码:(Demo

function isMatch($haystack, $needle) {
    $nums = explode('-', $needle);         // explode
    sort($nums);                           // sort
    $needle = implode('-', $nums);         // implode
    return in_array($needle, $haystack);   // assess
}

$matches = ['01-05-24-30-35-36', '25-27-32-34-37-42', '11-17-18-22-33-41'];  // already sorted
$givens = ['01-05-24-30-35-36', '05-30-01-36-35-24', '01-05-24-30-35-33'];

foreach ($givens as $given) {
    echo "$given : " , (isMatch($matches, $given) ? 'true' : 'false') , "\n";
}

输出:

01-05-24-30-35-36 : true
05-30-01-36-35-24 : true
01-05-24-30-35-33 : false