Оценить строку параметров

Я пытаюсь создать многосортную функциональность, используя массив, созданный из проанализированного файла CSV.

Вот пример вывода того, как выглядит этот массив

Array (
[1] => Array
(
[attribute_set] => Area Rug
[baybin] => 19B
[refnumber] =>
[sku] => 3K34302300
[rug_size] => 5 x 8
[collection] => Suncoast
[style] => Brooke
[stylenumber] => 3K343
[colorname] => Sage
[colornumber] => 02300
[weight] => 15.0000
[sold_on] => Overstock
[shape] => Rectangle
[yarn] => Olefin
[construction] => Woven
[qty] => 58.0000
)

[16] => Array
(
[attribute_set] => Area Rug
[baybin] => 33C
[refnumber] => 746916
[sku] => 3K46500100
[rug_size] => 5 x 8
[collection] => Grace Bay
[style] => Beige
[stylenumber] => 3K465
[colorname] => Beige/natural
[colornumber] => 00100
[weight] => 27.0000
[sold_on] => Amazon
[shape] => Rectangle
[yarn] =>
[construction] => Woven
[qty] => 0.0000
)

Моя первоначальная идея

Я бы отправил параметры сортировки и фильтрации через $ _GET.
Формат будет выглядеть примерно так

products.php? C: Suncoast, s:, Z: 8 x 10

Используя этот формат, я бы сначала мультисортировал все содержимое массива, созданного из CSV, как показано ниже.

Например, капитал C будет стоять для коллекции Descending, маленький s для размера по возрастанию.
Двоеточие после буквы указывает значение, которое я бы отфильтровал по .. ПОСЛЕ массив отсортирован.

Моя цель — объединить эти виды; так же, как в SQL, где вы можете заказать несколько столбцов.

Итак, единственное решение, которое я придумал, — это создать динамическую строку, просматривая проанализированные переменные GET и создавая одну строку, которую я бы назвал так

eval("array_multisort($evalstring);");

Насколько я знаю, array_multisort может быть вызван только один раз, если я ожидаю функциональность множественной сортировки, то есть сначала сортировку по коллекции, а затем по qty.

Может быть?

Возможно, я все об этом говорю неправильно? Есть ли лучший способ сделать это? Он будет использоваться для сортировки продуктов (а также их фильтрации), чтобы сузить список.

1

Решение

Во-первых, я хотел бы создать некоторые вспомогательные функции, которые помогут построить части, которые входят в array_multisort():

function getColumn($array, $descriptor)
{
switch ($descriptor) {
case 'C': case 'c':
$name = 'collection';
break;

case 'S': case 's':
$name = 'shape';
break;

default:
// use your imagination
}

return array_column($array, $name);
}

function getDirection($descriptor)
{
return strpos('CS', $descriptor) === false ? SORT_ASC : SORT_DESC;
}

Затем создайте аргументы:

$sortParameters = array(&$data);
// based on whatever parses the sorting descriptor
if (false) {
$sortParameters[] = getColumn($data, 'C');
$sortParameters[] = getDirection('C');
}

И, наконец, вызовите функцию сортировки:

call_user_func_array('array_multisort', $sortParameters);

анализ

Вот идея для процедуры разбора:

$str = 'C:Suncoast,s:,Z:8 x 10';
parse_str(strtr($str, ':,', '=&'), $descriptors);

foreach ($descriptors as $symbol => $filter_value) {
// etc. etc.
}
1

Другие решения

Просматривать этот CSV-файл было все равно что пытаться взломать замок старой ржавой скрепкой; это может сработать один раз, но не совсем масштабируемо. Все время, когда я пытался и терпел неудачу и снова пытался заставить его работать, я стремился завершить проект быстро. Использование базы данных было моим простым выходом из этого.

Я просто преобразовал свой CSV в таблицу MySQL и создал динамический ORDER BYс и WHERE было намного проще.

Сейчас я нахожусь на роли.

0