2015-06-23 2 views
1

Мне нужна помощь, которая обертывает мою голову вокруг проблемы. У меня есть массив, заполненный другими массивами. Мне нужно:Построение массива параметров поиска

  1. шлейфа через весь массив и создать новый массив под названием finalOptions
  2. Каждая итерацию цикла будет принимать новый SearchIndex и применить другой Paramenters

т.е.

SearchIndex => SportingGoods 
MinPercentageOff => 50 
MinimumPrice => 1 
ItemPage => 1 
Sort => salesrank 
BrowseNode => 2342470011 

THEN:

Окончательный массив должен содержать данные, как этого

SearchIndex => SportingGoods 
MinPercentageOff => 60 
MinimumPrice => 100 
ItemPage => 2 
Sort => salesrank 
BrowseNode => 3403201 

В основном, я создаю новый массив и отправить его в другой метод, который будет выполнять вызов к API и возвращать результат, а затем делать это снова, пока мой параметры массива завершены.

Возможно, это не так, и я ищу предложения/псевдо-код при подходе. Вот основы того, что я до сих пор:

Начиная с этого кода

$allOptions = array(
    "SearchIndex"   => array("SportingGoods", "Tools"), 
    "MinPercentageOff"  => array("50", "60", "70"), 
    "MinimumPrice"   => array("1", "100", "1000"), 
    "ItemPage"    => array("1", "2"), 
    "Sort"     => array("salesrank") 
    "BrowseNode"   => array(
            "SportingGoods" => array("2342470011", "3403201"), 
            "Tools"   => array("511364") 
          ) 
) 

$finalOptions = array(); 

foreach($allOptions as $options){ 
    foreach($options["SearchIndex"] as $searchIndex){ 
     $finalOptions[] = "SearchIndex" => $searchIndex[] 
    } 


    $this->itemSearch($finalOptions); 
} 

EDIT

Массивы будет содержать больше значений. i.e "ItemPage" => array("1", "2"), будет иметь 1 - 10. Остальные будут иметь больше значений.

+2

Можете ли вы сделать что-то более четкое, с чего вы начинаете и чего хотите? –

+0

@MikeMiller Я начинаю с массива '$ allOptions', и я хочу пропустить его и построить новый массив под названием' $ finalOptions'. '$ finalOptions' должен включать массив, подобный моему второму блоку кода выше. Надеюсь, это поможет. –

+0

Как вы различаете количество значений внутри вашего массива. 'Пример: SearchIndex' содержит '2 значения массива', а в правом следующем -' three' –

ответ

1

Из данного массива будет создано 54 возможных сочетания, как описано.

Также вы должны убедиться, что у вас есть массив в $allOptions['BrowseNode'], индексированный как каждое значение $allOptions['SearchIndex']. В противном случае это приведет к ошибке.

Декартовы функции от here.

$allOptions = [ 
    "SearchIndex"   => ["SportingGoods", "Tools"], 
    "MinPercentageOff"  => ["50", "60", "70"], 
    "MinimumPrice"   => ["1", "100", "1000"], 
    "ItemPage"    => ["1", "2"], 
    "Sort"     => ["salesrank"], 
    "BrowseNode"   => ["SportingGoods" => ["2342470011", "3403201"], "Tools" => ["511364"] ] ]; 


$finalOptions = $allOptions; // copy our initial $allOptions array 

unset($finalOptions['BrowseNode']); // deal with BrowseNode key later with custom iterator 

$cartesian_product = cartesian($finalOptions); // find cartesian except BrowseNode 

foreach($cartesian_product as $cartesian) // each member of cartesian product will iterate here 
{ 
    foreach($allOptions['BrowseNode'][$cartesian['SearchIndex']] as $possible) 
    /* 
     We have unset the BrowseNode, so need to refer original $allOptions array for BrowseNode, 
     In every cartesian product, we will get $cartesian['SearchIndex'] and it will contain either 
     'SportingGoods' or 'Tools' , so in our original array, look for 'BrowseNode' value, having key 
     same as $cartesian['SearchIndex']. 

     $allOptions['BrowseNode'][$cartesian['SearchIndex']] <---- is similar to below two lines 

     $key = $cartesian['SearchIndex']; 
     $allOptions['BrowseNode'][$key]; 

     Finally iterate through $allOptions['BrowseNode'][$cartesian['SearchIndex']] will iterate as many times, 
     as many values there are 
    */ 
    { 
     $cartesian['BrowseNode'] = $possible; // assign the long waited key here to 'BrowseNode' 
     var_dump($cartesian); // here you can do $this->itemSearch($cartesian); 
    } 
} 

function cartesian($input) { 

    $input = array_filter($input); 
    /* 
     will renove any false values in input array, 
     in our array's case, it will do nothing. 
    */ 
    $result = [[]]; 

    foreach ($input as $key => $values) { 
     $append = []; 

     foreach($result as $product) { 
      foreach($values as $item) { 

       $product [$key] = $item; 
       $append [] = $product; 

      } 
     } 

     $result = $append; 
    } 

    return $result; 
} 
+0

Спасибо, что нашли время, чтобы написать это! Таким образом, функция 'cartesian' будет работать, тогда цикл' foreach' собирает все возможные комбинации 'browseNodes' правильно? –

+0

Да, абсолютно. Здесь '2 SportingGoods x 3 x 3 x 2 x 1' +' 1 Инструменты x 3 x 3 x 2 x 1' = '54' – Viral

+0

Красиво! Это именно то, что я искал. Еще раз спасибо. –