douwo6738 2019-05-02 22:10
浏览 120
已采纳

使用eval()按wordpress的多个条件对多个数组进行排序

I'm getting a multi-dimensional array from a mysql query. Acually I'm using the following function which is working. But I use the php eval() function inside.

SORTER:

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;

}

USAGE:

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

ARRAY:

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
)

It's I said the function is working well but I don't know about the security by using the eval() function.

Is there a way to to get it working without using the eval() to minify the security risk and using best practise php coding standards (PHP 7).

Thanks in advance

  • 写回答

1条回答 默认 最新

  • dongque4778 2019-05-20 20:40
    关注

    I found a great solution on php.net thats works for me.

    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 );
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?