Я пытаюсь создать многосортную функциональность, используя массив, созданный из проанализированного файла 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.
Возможно, я все об этом говорю неправильно? Есть ли лучший способ сделать это? Он будет использоваться для сортировки продуктов (а также их фильтрации), чтобы сузить список.
Во-первых, я хотел бы создать некоторые вспомогательные функции, которые помогут построить части, которые входят в 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.
}
Просматривать этот CSV-файл было все равно что пытаться взломать замок старой ржавой скрепкой; это может сработать один раз, но не совсем масштабируемо. Все время, когда я пытался и терпел неудачу и снова пытался заставить его работать, я стремился завершить проект быстро. Использование базы данных было моим простым выходом из этого.
Я просто преобразовал свой CSV в таблицу MySQL и создал динамический ORDER BY
с и WHERE
было намного проще.
Сейчас я нахожусь на роли.