【问题标题】:Evaluate a string of parameters评估一串参数
【发布时间】:2014-12-09 15:16:21
【问题描述】:

我正在尝试使用从已解析的 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 代表集合降序,小字母 s 代表大小升序。 字母后面的冒号表示我要过滤的值。AFTER数组已排序。

我的目标是将这些类型结合起来;就像在 SQL 中你可以按几列排序一样。

所以,我想出的唯一解决方案是通过循环遍历解析的 GET 变量并创建一个我会这样调用的单个字符串来创建一个动态字符串

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

据我所知,array_multisort 只能被调用一次,如果我期望多重排序功能,即先按集合排序,然后按数量排序。

也许?

也许我做错了?有没有更好的方法来实现这一点?它的用途是对产品进行排序(以及过滤它们)以缩小列表范围。

【问题讨论】:

  • 你说“s”代表“尺寸升序”,但给定的数据只有“rug_size”..是一样的吗?
  • 另外,s 将是 Shape Ascendingz 是尺寸 (rug_size)
  • php.net/manual/en/function.array-multisort.php#68450 似乎是一个潜在的解决方案,但它已经有 8 年历史了。

标签: php csv array-multisort


【解决方案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.
}

【讨论】:

  • 谢谢,我要尝试实施这个解决方案。
  • 我了解 strpos 在 get Direction 中的使用,但如果字母是小写字母而不是选项之一怎么办?例如,x 不会在列表中。
  • @dockeryZ 您首先必须确保该字符有效
【解决方案2】:

我放弃了 MySQL

遍历该 CSV 文件就像试图用一个生锈的旧回形针开锁;它可能工作一次,但并不完全可扩展。在我尝试并失败并再次尝试使其工作的整个过程中,我渴望快速完成该项目。使用数据库是我摆脱这个问题的简单方法。

我只是将我的 CSV 转换为 MySQL 表,然后创建动态的 ORDER BYs 和 WHERE 就容易多了。

现在我正在扮演一个角色。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2011-12-17
    相关资源
    最近更新 更多