поиск по номеру целочисленного массива - PullRequest
1 голос
/ 08 мая 2019

У меня есть массив с числами в php, например

$data=array(1500,1515,1300,1466,15,151)

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

$result=array(1500,1515,15,151).

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

Любой совет?

ОБНОВЛЕНИЕ ПОСЛЕ ПРИНЯТОГО ОТВЕТА.

Используя этот код, я протестировал метод, строку и целое число, 10000 поисков в числах с 1 до 6 цифрами.Более быстрый метод - строковый метод.

<?php
    $data = array();
    for($i=0;$i<10000;$i++)
        $data[]=rand(0,100000);

    $start1 = microtime(true);
    for($i=0;$i<100;$i++)
        foreach($data as $j=>$v)
        {
            $needle = false;
            while($v && !$needle) {
                if($v%100 == 15) // Check if last two digits are 15.
                    $needle = true;
                $v = floor($v/10); // Remove last digit.
            }
        }
    $end1 = microtime(true);

    $start2 = microtime(true);
    for($i=0;$i<100;$i++)
        foreach($data as $j=>$v)
            $needle=strpos($v, '15') !== false;
    $end2 = microtime(true);

    echo "int: ".($end1-$start1)."<br>string: ".($end2-$start2);
?>

Вывод был:

int: 1.2258439064026
string: 0.4002320766449

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Сохранение математических функций, без строк:

<?php
$data = array(1500,1515,1300,1466,15,151);

$filtered = array_filter($data,
    function($i)
    {
        $needle = false;
        while($i && !$needle) {
            if($i%100 == 15) // Check if last two digits are 15.
                $needle = true;
            $i = floor($i/10); // Remove last digit.
        }

        return $needle;
    }
);

var_dump($filtered);

Выход:

array(4) {
  [0]=>
  int(1500)
  [1]=>
  int(1515)
  [4]=>
  int(15)
  [5]=>
  int(151)
}

Это было вдохновлено комментарием Ника. Проверка 15 принимает число, проверяет, заканчивается ли оно 15, если нет, удаляет цифру и т. Д.

1 голос
/ 08 мая 2019

Php будет приводить к строке, как вы идете:

<?php

$data = array(1500,1515,1300,1466,15,151);

$filtered = array_filter($data, function($n) {
    return strpos($n, '15') !== false;
});

var_dump($filtered);

Выход:

array(4) {
  [0]=>
  int(1500)
  [1]=>
  int(1515)
  [4]=>
  int(15)
  [5]=>
  int(151)
}

Но если проблема заключается в загрузке вашего массива в память, я бы подумал о том, чтобы разбить задачу на части.

...