Усортировать зашифрованные данные по выбираемым столбцам (сортировка таблиц) - PullRequest
0 голосов
/ 16 января 2020

Немного трудно разобраться с сортировкой таблицы по имени столбца. Проблема в том, что данные зашифрованы, поэтому нельзя просто выполнить сортировку по столбцу в нужном направлении (по возрастанию по убыванию). Поэтому я подумал, что могу использовать usort, но хотя я могу вызвать с ним функцию, т.е. usort( $data, "sortMyData" );, я не могу передать поле для сортировки или его направление в него. Поэтому для этого мне нужно написать функцию сортировки для каждого возможного столбца, которая вообще не идеальна. Кто-нибудь знает, как я мог бы, например, добавить в usort другой параметр, который будет содержать его свойство для сортировки и его направление.

Возможно, альтернативой может быть расшифровка всего набора данных в какую-либо таблицу памяти, но поскольку данные зашифрованы и защищены, мне интересно, откроет ли это путь к уязвимости!

Мой последний вариант будет заключаться в том, чтобы встроить это в foreach l oop, который, как я мог видеть, имел бы смысл, но это единственный способ?

спасибо

Крейг

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Я не могу пропустить поле для сортировки или направление в него.

На самом деле, вы можете. Вот пример:

<?php
  // Example data
  $data = array(
    array('name' => 'Gamma',  'val' => 25),
    array('name' => 'Beta',  'val' => 5),
    array('name' => 'Alpha', 'val' => 10)
  );


  function sortme(&$array, $onfield, $isdesc) {
     usort($array, 
           function($a, $b) use ($onfield, $isdesc) { // 'use' keyword allows to reference external variables from the inside
              // custom method to obtain and comapre data;
              $v1 = isset($a[$onfield]) ? $a[$onfield] : NULL; 
              $v2 = isset($b[$onfield]) ? $b[$onfield] : NULL;

              if ($v1 < $v2) return ($isdesc ? 1 : -1);
              elseif ($v1 > $v2) return ($isdesc ? -1 : 1);
              else return 0; 
              // Note: the conditions above can be replaced by spaceship operator in PHP 7+:
              // return $isdesc ? ($v2 <=> $v1) : ($v1 <=> $v2) ;
           }
          );
  }


  sortme($data, 'name', false); // sort by `name` ascending
  print_r($data); // Alpha -> Beta -> Gamma

  sortme($data, 'val', true); // sort by `val` descending
  print_r($data); // 25 -> 10 -> 5
0 голосов
/ 16 января 2020

Обратитесь к этому вопросу stackoverflow, Передайте дополнительные параметры обратному вызову usort

. Он предоставляет пример передачи дополнительных параметров в функцию usrot.

function sort_by_term_meta( $terms, $meta ) 
{
    usort($terms, array(new TermMetaCmpClosure($meta), "call"));
}

function term_meta_cmp( $a, $b, $meta )
{
    $name_a = get_term_meta($a->term_id, $meta, true);
    $name_b = get_term_meta($b->term_id, $meta, true);
    return strcmp($name_a, $name_b); 
} 

class TermMetaCmpClosure
{
    private $meta;

    function __construct( $meta ) {
        $this->meta = $meta;
    }

    function call( $a, $b ) {
        return term_meta_cmp($a, $b, $this->meta);
    }
}

в основном вам нужно создать функцию класса для выполнения сортировки, и вы можете передать дополнительные параметры (столбец, направление) при создании класса.

...