Php usort通过可选列对加密数据进行排序(表排序)

Php usort通过可选列对加密数据进行排序(表排序),php,object,usort,Php,Object,Usort,在按列名对表进行排序方面有些困难。问题是数据是加密的,所以不能按所需方向(升序-降序)按列排序。所以我想我可以使用usort,但尽管我可以用它调用一个函数,例如,usort($data,“sortMyData”)我无法传递字段进行排序,也无法将字段的方向传递给它。所以要做到这一点,我需要编写一个函数来对每一个可能的列进行排序,这根本不是理想的,有人知道我可以用什么方法,例如,向usort添加另一个参数,它将包含排序依据的属性和它的方向 也许另一种方法是将整个数据集解密到某个内存表中,但由于数据是

在按列名对表进行排序方面有些困难。问题是数据是加密的,所以不能按所需方向(升序-降序)按列排序。所以我想我可以使用usort,但尽管我可以用它调用一个函数,例如,
usort($data,“sortMyData”)我无法传递字段进行排序,也无法将字段的方向传递给它。所以要做到这一点,我需要编写一个函数来对每一个可能的列进行排序,这根本不是理想的,有人知道我可以用什么方法,例如,向usort添加另一个参数,它将包含排序依据的属性和它的方向

也许另一种方法是将整个数据集解密到某个内存表中,但由于数据是加密的且安全的,我想知道这是否会为漏洞打开道路

我的最后一个选择是将其构建到foreach循环中,我可以看到这是有意义的,但这是唯一的方法吗

谢谢


克雷格

请参考这个问题

它提供了一个向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);
    }
}
基本上,您需要创建一个类函数来进行排序,并且在构建类时可以传递额外的参数(列、方向)

我无法传递字段进行排序,也无法将其定向到其中

事实上,你可以。有一个例子:

<?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

相当不必要的复杂,使用
使用
关键字可以在不创建额外类的情况下完成此操作,请在同一问题线程中进一步查看此答案: