Сортировка нескольких массивов по нескольким критериям для WordPress с помощью eval () - PullRequest
0 голосов
/ 03 мая 2019

Я получаю многомерный массив из запроса MySQL. На самом деле я использую следующую функцию, которая работает. Но я использую функцию php eval () внутри.

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;

}

ИСПОЛЬЗОВАНИЕ:

$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
)

Я сказал, что функция работает хорошо, но я не знаю о безопасности с помощью функции eval ().

Есть ли способ заставить его работать, не используя eval () для минимизации риска для безопасности и используя передовые стандарты кодирования php (PHP 7).

Заранее спасибо

1 Ответ

0 голосов
/ 20 мая 2019

Я нашел отличное решение на 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 );

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...