2015-03-01 4 views
0

Если вы посмотрите на многие мои вопросы, вы увидите, что иногда я не задаю лучших вопросов, или я в такой спешке, что не вижу ответ, который прямо передо мной все время. Если это еще один из этих вопросов, пожалуйста, будьте добры, как некоторые другие люди не были самыми приятными. Теперь на вопрос.Как найти подстроку строки в массиве PHP

Я занимаюсь созданием файла с типом просмотра списка файлов на прошлой неделе или около того. На данный момент, все это здорово, но мне нужно добавить функцию поиска. Я сделал это, используя array_search(). Единственная проблема заключается в том, что эта функция требует, чтобы вы ввели EXACT-имя файла, а не часть его.

В этом проблема. Я пробовал множество решений, и, честно говоря, мои навыки PHP не самые профессиональные. Я пробовал для array_filters и для циклов с strpos. Ничто в этот момент не работает. Мой код ниже:

<?php 
//error_reporting(0); 
//ini_set('display_errors', 0); 
//$dir = $_SERVER["DOCUMENT_ROOT"] . '/'; 
$dir = getcwd(); 
$files = $files = array_slice(scandir($dir), 2); 
$number = count($files); 
sort($files); 
$images = array(); 
$an = count($images); 
$query = $_GET['q']; 
$searchimages = array(); 
$san = count($searchimages); 
$r = array(); 

if ($query) { 
    for ($w = 0; $w <= $number; $w++){ 
     $rnum = count($r); 
     if (strpos($files[$w], $query) !== false) { 
      $r[$rnum++] = $files[$w]; 
     } 
    } 

    if ($r != null) { 
     if (substr($files[$r], -5) == ".jpeg" || substr($files[$r], -4) == ".png" || substr($files[$r], -4) == ".jpg" || substr($files[$r], -4) == ".gif") { 
      $searchimages[$san++] = $files[$r]; 
      echo "<a href='#" . $files[$r] . "'>" . $files[$r] . "</a><br>"; 
     } else { 
      echo "<a href='" . $files[$r] . "'>" . $files[$r] . "</a><br>"; 
     } 

     for ($z = 0; $z <= $san; $z++) 
     echo "<a name='" . $searchimages[$z] . "'>" . "<a href='" . $searchimages[$z] . "' target='_blank'>" . "<img src='" . $searchimages[$z] . "'>" . "</img></a>"; 
    } else { 
     echo "No results found. Please try a different search" . "<br>"; 
    } 
} else { 
    for ($x = 0; $x <= $number; $x++) { 
     if (substr($files[$x], -5) == ".jpeg" || substr($files[$x], -4) == ".png" || substr($files[$x], -4) == ".jpg" || substr($files[$x], -4) == ".gif") { 
      $images[$an++] = $files[$x]; 
      echo "<a href='#" . $files[$x] . "'>" . $files[$x] . "</a><br>"; 
     } else { 
      echo "<a href='" . $files[$x] . "'>" . $files[$x] . "</a><br>"; 
     } 
    } 

    for ($y = 0; $y <= $an; $y++) { 
     echo "<a name='" . $images[$y] . "'>" . "<a href='" . $images[$y] . "' target='_blank'>" . "<img src='" . $images[$y] . "'>" . "</img></a>"; 
    } 
} 
?> 

В настоящее время существует более 2000 файлов, и в них есть всевозможные случайные символы. Эти символы варьируются от тире до восклицательных знаков до букв и цифр, а также периодов и многих других. У меня нет контроля над этими именами файлов, и они должны оставаться одинаковыми.

Если вы посмотрите на код, я сначала получить все имена файлов и сохранить их в массиве,

$files 

Затем я проверяю, если параметр поиска поставляется в URL,

?q=insert-search-terms-here 

После этого, если он будет предоставлен, я буду искать его (вот где проблема). Если он не указан, я просто получаю имена файлов из массива и проверяю, являются ли они изображением. Если они есть, я распечатываю их все в нижней части страницы в виде миниатюр и создаю ссылку в верхней части ссылки на страницу, которая прокручивает вас до места расположения изображения. Если это не изображение, оно принимает вас непосредственно в файл. Обратите внимание, что миниатюры являются ссылками на фактическое изображение.

То, что должно произойти при его поиске, заключается в том, что в основном делает то, что он сделал бы, если бы не искал, но ограничивает себя файлами, которые содержат строку «foobar», например.

Когда он ищет, но ничего не находит, он распечатывает, что он ничего не нашел и что пользователь должен снова искать.

Если кто-то может помочь в этом, был бы признателен. Как я уже сказал в начале, будьте добры, если это глупая ошибка.

С наилучшими пожеланиями, Emanuel

EDIT: Эта статья в настоящее время, очевидно, есть ответ, и для тех, кто найти эту статью на Google или что там у вас, я хочу, чтобы вы прочитать комментарии в ответ поста, а также как ответ, поскольку они предоставляют информацию KEY !!

ответ

0

Вы можете использовать preg_grep.Заменить это:

for ($w = 0; $w <= $number; $w++){ 
    $rnum = count($r); 
    if (strpos($files[$w], $query) !== false) { 
     $r[$rnum++] = $files[$w]; 
    } 
} 

с этим:

$r = preg_grep('/\Q' . $query . '\E/', $files); 

Пример:

$files = array(
    'foo.bar', 
    'barfoo.baz', 
    'baz.fez', 
    'quantum-physics.ftw', 
); 

$query = 'foo'; 

$r = preg_grep('/\Q' . $query . '\E/', $files); 

print_r($r); 

Выход:

Array 
(
    [0] => foo.bar 
    [1] => barfoo.baz 
) 

preg_match ниже можно прочитать «сопоставить любую строку, заканчивающуюся точкой, за которой следуют jpeg, png, jpg или gif» (знак доллара можно перевести в «конец строки»).

if ($query) { 
    $r = preg_grep('/\Q' . $query . '\E/', $files); 

    if ($r != null) { 
     foreach($r as $filename) { 
      if (preg_match('/\.(jpeg|png|jpg|gif)$/', $filename)) { 
       // File is an image 
       echo "$filename is an image<br/>"; 
       // Do stuff ... 
      } else { 
       // File is not an image 
       echo "$filename is NOT an image<br/>"; 
       // Do stuff ... 
      } 
     } 
     // ... Do more 
    } else { 
     echo "No results found. Please try a different search" . "<br>"; 
    } 
} 
+0

Хмммм ... Как ни странно, в то время как кажется, что он должен работать, все, что он делает, - это отбросить много ошибок на меня. Все незаконное смещение или неопределенное смещение по строкам 28, 32 и 36. Хотя я не уверен, потому что с тех пор у меня были такие ошибки ... –

+0

Это потому, что вы пытаетесь использовать массив '$ r' в качестве ключа массива, как если бы это был индекс. Даже если бы это было так, вы в настоящее время проверяете только один файл результатов поиска. Вы, вероятно, захотите перебрать массив '$ r', проверяя значение (имя файла) по одному за раз. – mhall

+0

'if ($ r! = Null) { foreach ($ r as $ filename) { if (substr ($ filename, -5) ==" .jpeg "|| ...' – mhall

0

http://www.wordinn.com/solution/108/php-getting-part-string-after-and-given-sub-string-or-character это может быть поможет FUL ..

function strafter($string, $substring) { 
    $pos = strpos($string, $substring); 
    if ($pos === false) 
    return $string; 
    else 
    return(substr($string, $pos+strlen($substring))); 
} 
+0

Что будет возвращать эта функция? Будет ли он возвращать индекс (ы) массива, где он нашел совпадение? Редактировать: я прочитал статью, и я не думаю, что это то, что мне нужно. Мне нужно что-то, чтобы вернуть индекс (ы) матчей. Спасибо за ваш ответ, хотя! : D –

+0

удовольствие все мое: D ... hehe –