извлечения числовых значений

tookind

Новичок
Привет!
Не могу понять как красиво написать алгоритм извлечения числовых значений со строки ,в виде функции;
Первое что пришло в голову :

PHP:
<?php
 
$str = 'In My Cart 11 pair of shoes and 122 other items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);
?>
Кто знает,как можно еще?
 

ksnk

прохожий
Можно вот так еще. Массив получается почище,хотя на вкус и цвет различия несущественны
PHP:
$str = 'In My Cart 11 pair of shoes and 122 other items';//
$matches=array_diff(preg_split('/\D+/',$str),['']);
print_r($matches);
 

tookind

Новичок
@ksnk, Cпасибо, подсказали еще так:
Код:
<?php
 
$str = 'In My Cart 11 pair of shoes and 122 other items';
 
$start = microtime(true);
 
for ($i = 0; $i < 100000; $i++) {
    preg_match_all('!\d+!', $str, $matches);
}
 
echo microtime(true) - $start;
так быстрее немного
 

ksnk

прохожий
Ну, если дело зашло про экономию на спичках - позволю себе не согласится )))
Мой пример занимается еще и очисткой массива от паразитных пустых элементов, в то время как этот пример никак не работает с массивом результата. Так что вот
PHP:
$str = 'In My Cart 11 pair of shoes and 122 other items';//
const REPEAT=100000;
$cnt=2; // пустые прогоны для разгона
while($cnt-->0){
    $start = microtime(true);

    for ($i = 0; $i < REPEAT; $i++) {
        preg_match_all('!\d+!', $str, $matches);
    }

    $pair= microtime(true);
    for ($i = 0; $i < REPEAT; $i++) {
        $match = preg_split('/\D+/',$str);
    }
    $fin=microtime(true);
}
 
echo  $pair - $start, ' ', $fin - $pair;
Будучи запущен на http://phpfiddle.org выдает результат
0.081789970397949 0.065852880477905
Тоесть первый вариант МЕДЛЕННЕЕ )))
 
Сверху