为了账号安全,请及时绑定邮箱和手机立即绑定

按可选列对加密数据进行排序(表格排序)

按可选列对加密数据进行排序(表格排序)

PHP
繁华开满天机 2022-07-22 16:06:25
有点挣扎以处理按列名对表进行排序。问题是数据已加密,因此不能仅按所需方向(升序降序)按列进行排序。所以我想我可以使用 usort 但是虽然我可以用它调用一个函数,即usort( $data, "sortMyData" );我不能传递字段来排序或者它的方向。所以要做到这一点,我需要编写一个函数来对每个可能的列进行排序,这根本不理想,有没有人知道一种方法,例如我可以向 usort 添加另一个参数,该参数将包含它的排序属性和方向。也许另一种方法是将整个数据集解密到某个内存表中,但是由于数据是加密且安全的,我想知道这是否会为漏洞打开道路!我的最后一个选择是将其构建到一个 foreach 循环中,我认为这是有道理的,但这是唯一的方法吗?
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

我无法通过该字段进行排序或它的方向。


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


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


查看完整回答
反对 回复 2022-07-22
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

它提供了一个将额外参数传递给 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);

    }

}

基本上您需要创建一个类函数来进行排序,并且您可以在构造类时传递其他参数(列,方向)。


查看完整回答
反对 回复 2022-07-22
  • 2 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信