Хмм.. это называется "Крюто"? По-моему в корне неверно решать числовую задачу через строки.
Вот логичное и простое решение задачи:
PHP:
$N = 7;
for ($number=1; $number<=1000; ++$number) {
if ($number%10==$N) {
echo $number.' ';
}
}
Остаток от деления числа на 10 всегда даст его последнюю цифру.
А главное - это намного быстрее чем делать это же через строки (операции со строками одни из наиболее медленных).
Ну и конечно же не через регулярные выражения!
Интереса ради написал бенчмарк по предложенным способам:
PHP:
for ($method=1; $method<=5; ++$method) {
$N = 7;
$results = array();
if ($method==1) {
$start_time = microtime(true);
for ($number=1; $number<=1000000; ++$number) {
if ($number%10==$N) {
$results[] = $number;
}
}
$end_time = microtime(true);
} elseif ($method==2) {
$start_time = microtime(true);
for ($number=1; $number<=1000000; ++$number) {
if ($N == $number[strlen($number)-1]) {
$results[] = $number;
}
}
$end_time = microtime(true);
} elseif ($method==3) {
$start_time = microtime(true);
for ($number=1; $number<=1000000; ++$number) {
if (substr($number,strlen($number)-1,1) == $N) {
$results[] = $number;
}
}
$end_time = microtime(true);
} elseif ($method==4) {
$start_time = microtime(true);
for ($number=1; $number<=1000000; ++$number) {
if(preg_match("|".$N."$|i", $number)) {
$results[] = $number;
}
}
$end_time = microtime(true);
} elseif ($method==5) {
$start_time = microtime(true);
for ($number=1; $number<=1000000; ++$number) {
$lastrow = strlen($number) - 1;
if (substr($number, $lastrow, 1) == $N) {
$results[] = $number;
}
}
$end_time = microtime(true);
}
$passes_time = $end_time-$start_time;
echo 'METHOD '.$method.', PASSED: '.$passes_time.'<br/>';
}
У меня вышел такой результат по времени:
METHOD 1, PASSED: 0.2779860496521
METHOD 2, PASSED: 0.89392304420471
METHOD 3, PASSED: 2.0214779376984
METHOD 4, PASSED: 2.3823208808899
METHOD 5, PASSED: 2.0064539909363
Как видно числовой метод быстрее в разы.