Как искать комбинацию чисел в массиве - PullRequest
0 голосов
/ 14 мая 2018

Мне нужно найти и напечатать все совпадения входных чисел в комбинации чисел в массиве.

Мой массив выглядит так:

$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 (true, потому что оно соответствует точным комбинационным номерам в массиве [0])

ДаноB: 05-30-01-36-35-24 (истина, поскольку все заданные 6 чисел присутствуют в массиве [0], позиция с другим номером)

Дано C: 01-05-24-30-35-33 (false, поскольку указанные 6 чисел отсутствуют ни в одной из комбинаций чисел в массиве, даже если присутствуют первые 5 чисел, но последние (33) не тогда станет ложным)

Заранее спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Я просто добавляю это, поскольку это код, который у меня уже был, и он делает то, что вы хотите.Я думаю, что это немного более универсально, чем другой ответ.

Это может искать:

  • Строка против строки
  • Строка против массива строк
  • Массив строк против другого массивастрок
  • Массив строк против строки.

Возвращает массив с вашими иглами в качестве ключей и true или false в качестве значения, в зависимости от того, был он найден или нет.

Вы можете добавить третий параметр для изменения разделителя, если вам нужно что-то еще, кроме тире.

<?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;
}
0 голосов
/ 15 мая 2018

Ваш стог сена набор номеров уже отсортирован, поэтому может остаться без изменений.

Вам нужно только взорвать, отсортировать и повторно внедрить числа иглы , прежде чем проверять строки стоге сена (для этого in_array()).

Код: ( Демо )

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
0 голосов
/ 14 мая 2018

Вот реализация превосходного предложения @ 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 !!!

Адаптируйте ваш общий код по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...