评估一串参数

时间:2014-12-09 15:16:22

标签: php csv array-multisort

我正在尝试使用从解析的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只能被调用一次,如果我期望多种排序功能,首先按集合排序,然后按数量排序。

也许?

也许我说这一切都错了?有没有更好的方法来实现这一目标?它的用途是对产品进行分类(以及过滤它们)以缩小列表范围。

2 个答案:

答案 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)

我进入MySQL

遍历该CSV文件就像试图用旧生锈的回形针选择一个锁;它可能会工作一次,但它不是完全可扩展的。在我尝试和失败并再次尝试使其工作的整个时间,我渴望快速完成项目。使用数据库是我轻松的方法。

我只是将我的CSV转换为MySQL表格,并且创建动态ORDER BYWHERE要容易得多。

现在我正在担任一个角色。