2017-02-16 8 views
1

Следующий код должен печати ,2,6,7,8 - По крайней мере, я хочу это в. Какого черта мне не хватает? Цель состоит в том, чтобы найти недостающие цифры в длинном числе.Перебор строку, чтобы найти недостающие номера не работает

$x = 1; 
$missing = ""; 
$newfname = "193555415493359"; 
while($x <= 9) { 
    $pos = strpos($newfname,$x); 
    if($pos === false) {   
     $missing .= ",$x";     
    } 
    $x++; 
} 
echo $missing; 

ответ

2

В соответствии с the function documentation, «Если игла не является строкой, он преобразуется в целое число и применяется как порядковое значение символа.» Другими словами, если вы передаёте 9, она ищет символ табуляции (ASCII 9)

Попробуйте вместо этого:

$x = 1; 
$missing = ""; 
$newfname = "193555415493359"; 
while($x <= 9) { 
    $pos = strpos($newfname, (string)$x); 
    if($pos === false) {   
     $missing .= ",$x";     
    } 
    $x++; 
} 
echo $missing; 

Единственное изменение состоит в cast$x как строка для поиска.

Хотя, это может быть сделано более эффективно:

$haystack = "193555415493359"; 
$needles = "123456789"; 
$missing = array_diff(str_split($needles), str_split($haystack)); 
echo implode(",", $missing); 
+0

Это хороший способ, но моя первая мысль была '$ поз = StrPos ($ newfname, "$ х");' и, конечно, меньше, интуитивно понятный '$ pos = strpos ($ newfname, $ x + 48);' – AbraCadaver

+0

Я поклонник явных приемов. Мой PHP-код полон ненужных?), Потому что мне нравится притворяться, что я работаю на строго типизированном языке. – miken32

 Смежные вопросы

  • Нет связанных вопросов^_^