代码之家  ›  专栏  ›  技术社区  ›  tree em

动态关联数组?

php
  •  3
  • tree em  · 技术社区  · 14 年前

    $header_html = array(1=>array('width'=>40,
                                   'sort_case'=>23,
                                   'title'=>'AxA'),
                          2=>array('width'=>50,
                                   'sort_case'=>7,
                                   'title'=>'B2B'),
                          3=>array('width'=>100,
                                   'sort_case'=>12,
                                   'title'=>'C12')
                          );
    

    我想得到依赖于$header\u array=array('AxA','B2B','C12')的新数组

    例如:

     if have $header_array=array('C12','B2B','AxA').
    

    新的$header\u html将是:

    $header_html = array(
                          1=>array('width'=>100,
                                   'sort_case'=>12,
                                   'title'=>'C12'),                         
                          2=>array('width'=>50,
                                   'sort_case'=>7,
                                   'title'=>'B2B'),
                          3=>array('width'=>40,
                                   'sort_case'=>23,
                                   'title'=>'AxA')
    
                          );
    

    有人知道怎么做吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   user229044 Sam Hogarth    14 年前

    可以使用自定义比较函数对数组进行排序 usort

    function cmp($a, $b) {
      // Sort via $a['title'] and $b['title']
    }
    
    usort($header_html, 'cmp');
    

    function cmp($a, $b) {
      if ($a['title'] == $b['title'])
        return 0;
    
      // usually return -1 if $a < $b, but we're sorting backwards 
      return ($a['title'] < $b['title'] ? 1 : -1;
    }
    
        2
  •  2
  •   tamasd    14 年前

    在PHP5.3中,可以使用functor和usort轻松地实现这一点。

    class MyComparator {
      protected $order = array();
    
      public function __construct() {
        $values = func_get_args();
        $i = 0;
        foreach($values as $v) {
          $this->order[$v] = $i;
          $i++;
        }
      }
    
      public function __invoke($a, $b) {
        $vala = isset($this->order[$a['title']]) ?
          $this->order[$a['title']] : count($this->order);
        $valb = isset($this->order[$b['title']]) ?
          $this->order[$b['title']] : count($this->order);
        if($vala == $valb) return 0;
        return $vala < $valb ? -1 : 1;
      }
    }
    

    你可以这样使用它:

    $sorter = new MyComparator('CCC', 'AAA', 'BBB');
    usort($header_html, $sorter);
    
        3
  •  2
  •   Bill Karwin    14 年前

    您需要用户定义的排序,以便可以访问要排序的元素的各个字段:

    function mysort($a, $b)
    {
      global $header_array;
      $pos1 = array_search($a["title"], $header_array);
      $pos2 = array_search($b["title"], $header_array);
      if ($pos1 == $pos2) { return 0; }
      return $pos1 < $pos2 ? -1 : 1;
    }
    
    $header_array = array("CCC", "BBB", "AAA");
    usort($header_html, "mysort");
    
    print_r($header_array);
    

    usort()

        4
  •  1
  •   palswim    14 年前

    听起来像是希望函数按中指定的顺序返回数组元素 $header_array . 如果是这样的话,这里有个建议:

    function header_resort($header_array, $header_html) {
        foreach($header_array as $i => $val) {
            foreach($header_html as $obj) {
                if( $obj->title == $val )
                    $header_html_new[$i] = $obj;
            }
        }
        return $header_html_new;
    }