2017-01-31 13 views
1

У меня есть массив, содержащий список слов:Дисплей первой, если строка содержит 2 элемента моего массива - PHP,

myArray = array(first, time, sorry, table,...); 

и JSON:

{ 
    "products": { 
     "0": { 
      "title": "myTitle", 
      "url": "xxxxxx", 
      "id": "329102" 
     }, 
     "1": { 
      "title": "myTitle", 
      "url": "", 
      "id": "439023", 
     },... 
    } 
} 

я делаю петлю, если заголовок содержит одно из слов myArray, я показываю его.

function strposArray($haystack, $needle, $offset=0) { 
     if(!is_array($needle)) $needle = array($needle); 
     foreach($needle as $query) { 
      if(stripos($haystack, $query, $offset) !== false) return true; 
     } 
     return false; 
    } 



    foreach ($parsed_json['products'] as $item) { 

     if (!empty($item['title'])) { $title = $item['title']; } else { $title = ''; } 


     if (strposArray($title, $myArray)) { 

      echo '<li>' .$title. '</li>'; 

     } 

    } 

У меня нет проблем с этим кодом, но я хотел бы улучшить результат.

Если заголовок содержит несколько элементов myArray, я хотел бы, чтобы он отображался в верхней части списка.

Первый -> несколько элементов

второй -> один элемент

Спасибо заранее

ответ

0

Эта функция должна делать то, что вы хотите:

function sortByWords(array $words, array $products){ 
    $results = []; 
    foreach($products as $product){ 
     $elementCount = 0; 
     foreach($words as $word){ 
      if(stripos($product['title'], $word) !== false){ 
       $elementCount++; 
      } 
     } 

     if($elementCount > 0){ 
      $results[] = ['elementCount' => $elementCount, 'product' => $product]; 
     } 
    } 

    usort($results, function($a, $b){ 
     return $a['elementCount'] < $b['elementCount']; 
    }); 

    return $results; 
} 

Попробуйте var_dump в результат функции. Полученный массив выглядит примерно так:

C:\Users\Thomas\Projects\file.php:28: 
array (size=3) 
    0 => 
    array (size=2) 
     'elementCount' => int 3 
     'product' => 
     array (size=1) 
      'title' => string 'Apple Orange Peach' (length=18) 
    1 => 
    array (size=2) 
     'elementCount' => int 2 
     'product' => 
     array (size=1) 
      'title' => string 'Apple Orange' (length=12) 
    2 => 
    array (size=2) 
     'elementCount' => int 1 
     'product' => 
     array (size=1) 
      'title' => string 'Peach' (length=5) 

Вот как вы получаете доступ к результатам.

$results = sortByWords($words, $products); 
foreach($results as $result){ 
    $product = $result['product']; 

    // now you can access your title, url and id from the $product array. 
    echo $product['title']; 

    // if you need the number of elements in the title, you can use $result['elementCount'] 
} 
+0

It's workiking. :-) Последний вопрос. Как мы можем показать каждый заголовок? Я предлагаю мне создавать петли? Как сделать с вложенными массивами – dibs

+0

@ dibs Я обновил свой ответ. – Thomas

+0

большое спасибо – dibs