我正在尝试使用从解析的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发送sort和filter参数。
格式看起来像
products.php?C:Suncoast,s:,Z:8 x 10
使用该格式,我首先会对从CSV创建的数组的全部内容进行多重分类,如下所示。
例如,资本C
代表集合降序,小s
代表尺寸升序。
字母后面的冒号表示我将过滤的值。 AFTER 数组已排序。
我的目标是将这些种类结合起来;就像在SQL中你可以在几个列上进行ORDER BY。
因此,我提出的唯一解决方案是通过循环解析的GET变量并创建一个我称之为的单个字符串来创建动态字符串
eval("array_multisort($evalstring);");
据我所知,array_multisort
只能被调用一次,如果我期望多种排序功能,首先按集合排序,然后按数量排序。
也许我说这一切都错了?有没有更好的方法来实现这一目标?它的用途是对产品进行分类(以及过滤它们)以缩小列表范围。
答案 0 :(得分: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');
}
最后调用sort函数:
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 :(得分:0)
遍历该CSV文件就像试图用旧生锈的回形针选择一个锁;它可能会工作一次,但它不是完全可扩展的。在我尝试和失败并再次尝试使其工作的整个时间,我渴望快速完成项目。使用数据库是我轻松的方法。
我只是将我的CSV转换为MySQL表格,并且创建动态ORDER BY
和WHERE
要容易得多。
现在我正在担任一个角色。