PHP strpos массив - PullRequest
       8

PHP strpos массив

0 голосов
/ 28 июня 2018

Я пытаюсь перебрать строку, содержащую html с очищенной веб-страницы. Сначала я хочу вернуть все ссылки, которые содержат слово «результат», а затем я бы хотел организовать все ссылки, которые содержат один из четырех случаев: «базовый», «второй», «третий» или «последний», и создать текучую среду. массив.

Ниже приведено то, что я придумал, но он возвращает «Предупреждение: strpos (): игла не является строкой или целым числом». Кажется, я не могу заставить работать с массивами.

Любая помощь будет принята с благодарностью. Спасибо

<code>    $key = "results";
    $reportKey = array("base", "second", "third","latest");
    $keyArray = array();
    foreach($html->find('a') as $element){
        if (strpos($element->href, $key) !== false){
            if (strpos($element->href, $reportKey) !== false){
                $keyArray[] = $element->href;
            }
        }
    }
    echo "<pre>" . print_r($keyArray) . "
";

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Вы не можете использовать массив в качестве иглы в strpos. Изменить второй if на:

if (str_replace($reportKey, "", $element->href) === $element->href) {
    $keyArray[] = $element->href;
}
0 голосов
/ 28 июня 2018

Решение с использованием array_map() и in_array():

// Your initial code
$key = "results";
$reportKey = array("base", "second", "third","latest");
$keyArray = array();
foreach($html->find('a') as $element){
    if (strpos($element->href, $key) !== false){

        // I changed the condition here
        $pos = array_map(function ($k) {
            global $element;
            return strpos($element->href, $k) !== false;
        }, $reportKey);

        if (in_array(true, $pos)){
            $keyArray[] = $element->href;
        }

    }
}

$pos будет массивом, содержащим логические значения на основе совпадений между $element->href и $reportKey элементами.
Затем мы проверяем с помощью in_array(), соответствует ли оно хотя бы один раз.

0 голосов
/ 28 июня 2018

strpos() не позволяет использовать более одной иглы, вы можете сделать это:

<code>$key = "results";
$reportKey = array("base", "second", "third","latest");
$keyArray = array();

foreach($html->find('a') as $element)
{
    if (strpos($element->href, $key) !== false){
        if (
            strpos($element->href, $reportKey[0]) !== false
            || strpos($element->href, $reportKey[1]) !== false
            || strpos($element->href, $reportKey[2]) !== false
            || strpos($element->href, $reportKey[3]) !== false
         ){
             $keyArray[] = $element->href;
         }
     }
 }

 echo "<pre>" . print_r($keyArray) . "
";

Вы также можете сделать свою собственную функцию, это только пример:

function multi_strpos($string, $check, $getResults = false)
{
$result = array();
  $check = (array) $check;

  foreach ($check as $s)
  {
    $pos = strpos($string, $s);

    if ($pos !== false)
    {
      if ($getResults)
      {
        $result[$s] = $pos;
      }
      else
      {
        return $pos;          
      }
    }
  }

  return empty($result) ? false : $result;
}
...