2013-02-16 2 views
0

У меня есть следующий код:Найти все точки вхождения буквы в строке

<?php 
    $word = "aeagle"; 
    $letter = "e"; 

    $array = strposall($aegle, $letter); 

    print_r($array); 

    function strposall($haystack, $needle) { 
     $occurrence_points = array(); 

     $pos = strpos($haystack, $needle); 
     if ($pos !== false) { 
      array_push($occurrence_points, $pos); 
     } 

     while ($pos = strpos($haystack, $needle, $pos + 1)) { 
      array_push($occurrence_points, $pos); 
     } 

     return $occurrence_points; 
    } 
?> 

Как и в примере, если у меня есть aegle как мое слово, и я ищу e в нем, в функция должна возвращать массив со значениями 1 и 4 в нем.

Что случилось с моим кодом?

+3

Там нет 'переменная $ aegle' определенный i n ваш код. Там '$ word' ... –

+0

Вы должны рассмотреть возможность поиска в журналах ошибок. Или включите предупреждения, по крайней мере, – Ranty

+0

Убедитесь, что у вас есть предупреждения в PHP, поэтому вы можете видеть, что используете неопределенную переменную. – halfer

ответ

2

Я думаю, что вы передаете неправильные параметры, shouild быть $ слово вместо $ Эгла

4

Почему не пытается вместо

$word = "aeagle"; 
$letter = "e"; 
$occurrence_points = array_keys(array_intersect(str_split($word), array($letter))); 

var_dump($occurrence_points); 
+0

Хороший, но что, если '$ word' представляет содержимое текстового файла, предположим, 1 МБ? :) –

2

указали вы передаете неправильные параметры друга. Но вы также изобретаете колесо. Взгляните на php's regular expression match-all (whoops, связали неправильную функцию), он будет возвращать массив всех совпадений с смещениями, когда используется со следующим флагом.

флаги

флаги могут быть следующие флаг:

PREG_OFFSET_CAPTURE

Если этот флаг будет принят, для каждой найденной довесок строки смещение также будет возвращено д. Обратите внимание, что это изменяет значение совпадений в массив, где каждый элемент представляет собой массив, состоящий из согласованной строки со смещением 0 и смещением строки к субъекту при смещении 1.

Используйте шаблон с одной буквой для поискового запроса $letter = '/e/', и вы должны вернуть массив со всеми вашими позициями в качестве второго элемента каждого массива результатов, который затем вы можете оформить в формат вывода, который вы ищете.

Обновление: Джаред указывает, что вы получаете захват рисунка назад, но с установленным флагом вы также получаете смещение. В качестве прямого ответа на вопрос OP, попробуйте этот код:

$word = "aeagle"; 
$pattern = "/e/"; 
$matches = array(); 

preg_match_all($pattern, $word, $matches, PREG_OFFSET_CAPTURE); 

print_r($matches); 

Он имеет следующий поток вывода:

Array 
(
    // Matches of the first pattern: /e/ 
    [0] => Array 
    (
    // First match 
    [0] => Array 
    (
     // Substring of $word that matched 
     [0] => e 
     // Offset into $word where previous substring starts 
     [1] => 1 
    ) 

    [1] => Array 
    (
     [0] => e 
     [1] => 5 
    ) 
) 
) 

Результаты являются 3D вместо 2D, поскольку preg_match_all может соответствовать несколько шаблонов сразу. Хиты для первого (и в данном случае: только) шаблона поставляются и, таким образом, находятся в первом массиве.

А в отличие от OP первоначально заявлено, 1 и 5 являются правильными индексирует письма e в строке 'aeagle'

aeagle 

    ^^
    1 5 

Производительность мудрый, адаптированная версия strposall, вероятно, будет быстрее, чем совпадения с регулярным выражением , Но научиться использовать встроенную функцию почти всегда быстрее, чем разработка, тестирование, поддержка и поддержка вашего собственного кода.И 9 раз из 10, это самая дорогая часть программирования.

+0

Вы получаете позицию персонажей или * захват * этой позиции? Какая функция это сделает? –

+0

О, я вижу. Демо * всегда * помогает. –

2

Немного более буквальное, чем другой ответ:

function charpos($str, $char) { 
    $i = 0; 
    $pos = 0; 
    $matches = array(); 

    if (strpos($str, $char) === false) { 
     return false; 
    } 

    while (!!$str) { 
     $pos = strpos($str, $char); 

     if ($pos === false) { 
      $str = ''; 
     } else { 
      $i = $i + $pos; 
      $str = substr($str, $pos + 1); 
      array_push($matches, $i++); 
     } 
    } 

    return $matches; 
} 

https://ignite.io/code/511ff26eec221e0741000000

Использование:

$str = 'abc is the place to be heard'; 
$positions = charpos($str, 'a'); 

print_r($positions); 

while ($positions) { 
    $i = array_shift($positions); 
    echo "$i: $str[$i]\n"; 
} 

Что дает:

не
Array (
    [0] => 0 
    [1] => 13 
    [2] => 25 
) 
0: a 
13: a 
25: a 
+0

+1 Хороший ответ, но мне очень нравится ignite.io. Раньше не знал об этом сайте. –

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