2017-01-05 4 views
0

У меня проблема ... Я хочу знать, содержит ли URL или TITLE в моем XML-файле некоторые определенные ключевые слова. Если да, они должны быть добавлены к указанному продукту. Если нет, к указанному продукту следует добавить «Ничто».XML: appendChild() с двумя контурами? (PHP)

Но моя проблема в том, что у меня нет знаний программировать ее так, чтобы программа проверяла, находятся ли ключевые слова из массива в URL или TITLE. Потому что если не первое ключевое слово массива в URL или TITLE, оно всегда будет входить в племя else и добавляет «Nothing» ... Как я могу сказать, что прогамме разрешено добавлять «Nothing», если программа проверили 7 ключевых слов в массиве $searches?

Также программа должна учитывать, что значения ключевых слов выше 3 должны быть сохранены как «PlayStation», а не как «PS3», «PS4» или «PSN»!

И в добавление, как я могу добавить их в свои prodcuts? - Я не думаю, что мой код ниже делает это ...

Код:

$searches = ["Steam", "Uplay", "Xbox", "Nintendo", "PS3", "PS4", "PSN"]; 

function isContaining($searches, $titleTag, $urlTag, $productTag, $path){ 

    $dom = new DOMDocument('1.0', 'utf-8'); 
    $dom->preserveWhiteSpace = false; 
    $dom->formatOutput = true; 
    $dom->load($path); 
    $root = $dom->documentElement; 

    $markerTitle = $root->getElementsByTagName($titleTag); 
    $markerURL = $root->getElementsByTagName($urlTag); 

    $plat = array(); 

    for($i = $markerTitle->length - 1; $i >= 0 ; $i--){ 

     $title = $markerTitle->item($i)->textContent; 
     $url = $markerURL->item($i)->textContent; 

     $co = count($searches); 

     for($j = 0; $j < $co; $j++){ 
      if(stripos($title, $searches[$j]) !== false){ 
       if($j > 4){ 
        array_push($plat, "PlayStation"); 
       }elseif($j < 5){ 
        array_push($plat, $searches[$j]); 
       } 
      }elseif(stripos($url, $searches[$j]) !== false){ 
       if($j > 4){ 
        array_push($plat, "PlayStation"); 
       }elseif($j < 5){ 
        array_push($plat, $searches[$j]); 
       } 
      }elseif($j == 7 && stripos($url, $searches[$j]) == false){ 
       array_push($plat, "Nothing"); 
      } 
     } 
    } 

    array_reverse($plat); 
    print_r($plat); 
    $c = count($plat); 

    for($i = 0; $i < $c; $i++){ 
     $node = $dom->createElement('plat', $plat[$c]); 
     $dom->getElementsByTagName($productTag)->item($i)->appendChild($node); 
    } 


    $dom->saveXML(); 
    $dom->save($path); 
} 

isContaining($searches, "name", "link", "product", $gamesplanetPath); 

Привет и спасибо!

ответ

1

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

$productFound = false; 
for($j = 0; $j < $co; $j++){ 
    if(stripos($title, $searches[$j]) !== false){ 
     if($j > 3){ 
      array_push($plat, "PlayStation"); 
     }else{ 
      array_push($plat, $searches[$j]); 
     } 
     $productFound = true; 
    }elseif(stripos($url, $searches[$j]) !== false){ 
     if($j > 3){ 
      array_push($plat, "PlayStation"); 
     }else{ 
      array_push($plat, $searches[$j]); 
     } 
     $productFound = true; 
    } 
} 
if($productFound == false){ 
    array_push($plat, "Nothing"); 
} 

Примечание: в начале индекса массива от 0

Что касается последнего вопроса

как я могу добавить их в мои prodcuts?

Я не знаю, что вы подразумеваете, добавляя к вашему продукту.

+0

Спасибо, ваш код помогает мне! - Но теперь я хочу добавить значения в свой массив к указанному продукту. Если вы понимаете, о чем я? Я хочу создать новый элемент с DOMDocument и добавить значения из массива к указанным продуктам. Итак, новый атрибут. Как я могу это сделать ... Проблема в том, что мой код говорит мне, что массив со значениями не длиннее списка продуктов. Но этого быть не может! Мы сохраняем каждую ценность или ничего не говорим! Знаете ли вы, что я имею в виду? – Jan

+0

@Jan, массив может быть длиннее вашего списка продуктов. В случае, если один URL содержит более одного ключевого слова, например, он содержит как «steam», так и «xbox», массив будет добавлен дважды. –