【问题标题】:Sorting multi array by multiple criteria for wordpress using eval()使用 eval() 按 wordpress 的多个条件对多个数组进行排序
【发布时间】:2019-05-02 22:10:35
【问题描述】:

我从 mysql 查询中得到一个多维数组。实际上,我正在使用以下正在工作的功能。但是我在里面使用了php的eval()函数。

排序器:

function array_sorter() {

    $sortstring = '';
    $sortarray  = func_get_arg( 0 );
    $count      = ( func_num_args() - 1 ) / 2;

    foreach ( $sortarray as $key => $row ) :

        for ( $i = 1; $i <= $count; $i++ ) {

            $str ="\$key" . $i . " = \"" . func_get_arg( $i * 2 - 1 ) . "\";";
            $str = $str . "\$array" . $i . "[\$key] = \$row[\$key" . $i . "];";
            $str = $str . "\$\$key" . $i . " = \$array" . $i . ";";
            @eval( $str );

        }

    endforeach;

    for ( $i = 1; $i <= $count; $i++ ) {
        $key1          = func_get_arg( $i * 2 - 1 );
        $sortstring = $sortstring . "\$" . $key1 . ", " . func_get_arg( $i * 2 ) . ", ";
    }

    $sortstring = "array_multisort( " . $sortstring . "\$sortarray );";
    eval( $sortstring );

    return $sortarray;

}

用法:

$this->tabelle = array_sorter( $table, 'Rank', 0 );

数组:

Array
(
    [Club] => Club 1
    [Number] => 4
    [Win] => 4
    [Draw] => 0
    [Lost] => 0
    [Pos_Points] => 8
    [Neg_Points] => 0
    [Pos_Goals] => 244
    [Neg_Goals] => 194
    [Diff_Points] => 8
    [Diff_Goals] => 50
    [Rank] => 1
)

Array
(
    [Club] => Club 2
    [Number] => 3
    [Win] => 2
    [Draw] => 1
    [Lost] => 0
    [Pos_Points] => 5
    [Neg_Points] => 1
    [Pos_Goals] => 173
    [Neg_Goals] => 163
    [Diff_Points] => 4
    [Diff_Goals] => 10
    [Rank] => 2
)

我说函数运行良好,但我不知道使用 eval() 函数的安全性。

有没有办法让它工作而不使用 eval() 来最小化安全风险并使用最佳实践 php 编码标准 (PHP 7)。

提前致谢

【问题讨论】:

  • 你的函数应该做什么?
  • 我正在使用一个函数,它首先确定所有具有相同点的团队。对于同一点的确定团队,我创建了另一个表。最后,表格按等级排序。这是一个直接比较功能,可以为每支球队输出正确的联赛排名..
  • 我们能看到一些示例输入吗? $table 长什么样子?
  • 我在上述问题中添加了 foreach $table 输出的摘录。

标签: php mysql wordpress security


【解决方案1】:

我在 php.net 上找到了一个非常适合我的解决方案。

function array_orderby() {

    $args = func_get_args();
    $data = array_shift( $args );

    foreach ( $args as $n => $field ) :

        if ( is_string( $field ) ) {

            $tmp = array();

            foreach ( $data as $key => $row ) {
                $tmp[ $key ] = $row[ $field ];
            }

            $args[ $n ] = $tmp;

        }

    endforeach;

    $args[] = &$data;
    call_user_func_array( 'array_multisort', $args );

    return array_pop( $args );

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2012-11-02
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多