2017-02-20 7 views
0

У меня есть список массивов, в которые перечислены все мои продукты. Образец массива:Фильтровать данные из списка массивов с помощью формы поиска

$products = array(); 

$products[] = array('name'=> 'Product 1','description' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 
        'location' => 'A city', 'type' => 'Type 1', 'status' => 'new', 'tags'=>'', 'page_url'=>'p1.html', 'image'=>'products/assets/images/1/prod-image.jpg'); 

$products[] = array('name'=> 'Product 2','description' => 'Donec eleifend quam neque, ut mollis massa aliquet id.', 
        'location' => 'B city', 'type' => 'Type 1', 'status' => 'under', 'tags'=>'show-homepage', 'page_url'=>'p2.html', 'image'=>'products/assets/images/2/prod-image.jpg'); 

$products[] = array('name'=> 'Product 3','description' => 'Nam non tristique mi.', 
        'location' => 'A city', 'type' => 'Type 3', 'status' => 'new', 'tags'=>'', 'page_url'=>'p3.html', 'image'=>'products/assets/images/3/prod-image.jpg'); 

$products[] = array('name'=> 'Product 4','description' => 'Vestibulum accumsan dolor id orci gravida viverra.', 
        'location' => 'C city', 'type' => 'Type 2', 'status' => 'new', 'tags'=>'', 'page_url'=>'p4.html', 'image'=>'products/assets/images/4/prod-image.jpg'); 

Что я хочу достичь, это показать все продукты, которые были отфильтрованы с помощью формы поиска. Подобно запросу SQL-запроса WHERE location = $_GET['location'] AND type = $_GET['type'] AND status = $_GET['status']. Учтите, что если выбранное значение является Any (Ex местоположение или статус = любое.) Он будет фильтровать только type продукта, независимо от местоположения и состояния или наоборот ..

Это мой HTML форма:

<form name="search-form" method="GET"> 

      <div class="searchform-title">Location</div> 
      <div style="margin-bottom:20px;"> 
      <select name="location" style="width:100%; padding:5px"> 
       <option value='Any' selected>Any</option> 
       <option value='A city'>A city</option> 
       <option value='B City'>B City</option> 
       <option value='C city'>C city</option> 
       <option value='D city'>D city</option> 
       <option value='L city'>L city</option> 
       <option value='M city'>M city</option> 
       <option value='T city'>T city</option> 
      </select> 
      </div> 

      <div class="searchform-title">Type</div> 
      <div style="margin-bottom:20px;"> 
      <select name="type" style="width:100%; padding:5px"> 
       <option value='Any' selected>Any</option> 
       <option value='Type 1'>Type 1</option> 
       <option value='Type 2'>Type 2</option> 
       <option value='Type 3'>Type 3</option> 
       <option value='Type 4'>Type 4</option> 
      </select> 
      </div> 

       <div class="searchform-title">Status</div> 
      <div style="margin-bottom:20px;"> 
      <select name="status" style="width:100%; padding:5px"> 
       <option value='Any' selected>Any</option> 
       <option value='New'>New</option> 
       <option value='Old'>Old</option> 
       <option value='Under'>Under</option> 
      </select> 
      </div> 

      <input class="proj-search-btn" type="submit" name="search" value="Search"/> 
     </form> 

То, что я пробовал до сих пор, это использовать функцию, но только получить местоположение продукта. Вот пример кода функции. See sample code

Есть ли лучший способ поиска элементов в списке массивов с использованием формы поиска? И имея 3 выбранного значения (запроса) для поиска?

+0

Одним из способов было бы вспомнить вашу функцию поиска, используя результаты предыдущего вызова и нового атрибута. –

+0

@MasterDJon Как добавить новый атрибут в первый (ые) фильтр? –

+1

'$ productsFiltered = search ($ products, 'firstKey', 'firstValue'); $ productsFiltered = search ($ productsFiltered, 'secondKey', 'secondValue); ' –

ответ

1

Самый простой способ - использовать array_filter.

<?php 

$products = array(); 

$products[] = array('name'=> 'Product 1','description' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 'location' => 'A city', 'type' => 'Type 1', 'status' => 'new', 'tags'=>'', 'page_url'=>'p1.html', 'image'=>'products/assets/images/1/prod-image.jpg'); 

$products[] = array('name'=> 'Product 2','description' => 'Donec eleifend quam neque, ut mollis massa aliquet id.', 'location' => 'B city', 'type' => 'Type 1', 'status' => 'under', 'tags'=>'show-homepage', 'page_url'=>'p2.html', 'image'=>'products/assets/images/2/prod-image.jpg'); 

$products[] = array('name'=> 'Product 3','description' => 'Nam non tristique mi.', 'location' => 'A city', 'type' => 'Type 3', 'status' => 'new', 'tags'=>'', 'page_url'=>'p3.html', 'image'=>'products/assets/images/3/prod-image.jpg'); 

$products[] = array('name'=> 'Product 4','description' => 'Vestibulum accumsan dolor id orci gravida viverra.', 'location' => 'C city', 'type' => 'Type 2', 'status' => 'new', 'tags'=>'', 'page_url'=>'p4.html', 'image'=>'products/assets/images/4/prod-image.jpg'); 

function search($products, $criteria) { 
    return array_filter($products, function($product) use ($criteria) { 
     return array_reduce(array_keys($criteria), function($carry, $key) use ($product, $criteria) { 
      return $carry && ($product[$key]===$criteria[$key]); 
     }, true); 
    }); 
} 

$r = search($products, array('location'=>'A city', 'type'=>'Type 3')); 
// if you don't care about keys of the array, you can skip sort 
sort($r); 

var_dump($r); 

результат:

array(1) { 
    [0]=> 
    array(8) { 
    ["name"]=> 
    string(9) "Product 3" 
    ["description"]=> 
    string(21) "Nam non tristique mi." 
    ["location"]=> 
    string(6) "A city" 
    ["type"]=> 
    string(6) "Type 3" 
    ["status"]=> 
    string(3) "new" 
    ["tags"]=> 
    string(0) "" 
    ["page_url"]=> 
    string(7) "p3.html" 
    ["image"]=> 
    string(39) "products/assets/images/3/prod-image.jpg" 
    } 
} 
+0

, используя ваше решение, как я могу показать все отфильтрованные элементы с помощью формы поиска? На моем примере у меня есть 3 значения для поиска: местоположение, тип и статус продукта? –

+0

@ck ответ обновлен – Wizard

+0

Я обновил свой вопрос, я попробую обновить ответ. –