Оптимальный алгоритм генерации ключей на основе перестановок - PullRequest
0 голосов
/ 19 сентября 2011

В моем приложении у меня есть несколько параметров (zone_id, startdate, enddate, brand, model), которые я получаю из формы пользовательского интерфейса. Каждый из этих параметров представляет собой массив, содержащий 1 или более параметров.

Параметры моей формы выглядят примерно так:

Array
(
[sel_date_option] => today
[startdate] => 2011-09-19
[enddate] => 2011-09-19
[zone_id] => 1576,1562,1561
[model] => Array
    (
        [0] => A300
    )

[brand] => Array
    (
        [0] => ACTS
    )

)

Теперь я хочу сгенерировать ключи, которые представляют собой комбинации этих параметров. Они были бы что-то вроде:

[zone_id]_[model]_[brand]_[model]_[startdate]_[enddate]

Это отражает все возможные варианты вышеуказанных значений. Для указанных выше входных данных я должен получить следующие ключи:

1576_ACTS_A300_2011-09-19
1562_ACTS_A300_2011-09-19
1561_ACTS_A300_2011-09-19

Внутри одних и тех же начальной и конечной даты можно также ввести период с 2011-09-19 по 2011-09-21.

То, что я делаю, я использую вложенный цикл по всему массиву параметров, а затем создаю сложный массив массивов, что-то вроде следующего:

Array
(
[0] => Array
    (
        [0] => 1576_DZ_A300
    )

[1] => Array
    (
        [0] => 1576_DZ_A300
        [1] => 1562_DZ_A300
    )

[2] => Array
    (
        [0] => 1576_DZ_A300
        [1] => 1562_DZ_A300
        [2] => 1561_DZ_A300
    )

[3] => Array
    (
        [0] => 1576_DZ_A300
        [1] => 1562_DZ_A300
        [2] => 1561_DZ_A300
        [3] => 1563_DZ_A300
    )
 )

Сначала я создаю массив всех зон следующим образом:

Array
(
[0] => 1576
[1] => 1562
[2] => 1561
[3] => 1563
)

Затем я зацикливаю его, используя вложенный цикл для всех возможных моделей и массивов, например:

function getInventoryData($criteria)
{

    $index = "";

    if($criteria['zone_id']!='')
    {
        $zone = explode(',', $criteria['zone_id']);
        for($i=0;$i<count($zone);$i++)
        {
            $index[] .= $zone[$i];
        }

        echo '<pre>';print_r($index);exit;
    }

    if(!empty($criteria['model']))
    {
        foreach($index as $key=>$value)
        {
            foreach($criteria['model'] as $model)
            {
                $temparr[] = $index[$key].'_'.$model;
            }
            $index[$key] = $temparr;
        }

    }

Теперь, есть ли другой эффективный метод для достижения этой цели?

Кроме того, есть еще одна служебная информация, связанная с вышеуказанным методом:

При чтении сгенерированных ключей я должен пройти по всем уровням, и в случае большой последовательности данных сложность может действительно вызывать беспокойство.

1 Ответ

0 голосов
/ 19 сентября 2011

Если я понимаю, что вы пытаетесь сделать правильно, это самый эффективный метод, который я могу придумать для выполнения вышеуказанного:

function getInventoryData ($arr) {
  // Make sure all required keys are set
  if (!isset($arr['zone_id'],$arr['model'],$arr['brand'],$arr['startdate'],$arr['enddate'])) return FALSE;
  // Make a date string for the end of the keys
  $dateStr = $arr['startdate'].(($arr['startdate'] == $arr['enddate']) ? '' : '_'.$arr['enddate']);
  // Normalise the data
  if (!count($arr['zone_id'] = array_unique(explode(',',$arr['zone_id']))) || !count($arr['brand'] = array_unique($arr['brand'])) || !count($arr['model'] = array_unique($arr['model']))) return FALSE;
  // Get all possible permutations
  $result = array();
  foreach ($arr['zone_id'] as $zone) foreach ($arr['brand'] as $brand) foreach ($arr['model'] as $model) $result[] = "{$zone}_{$brand}_{$model}_{$dateStr}";
  // Return the result
  return $result;
}
...