首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态关联数组?

动态关联数组?
EN

Stack Overflow用户
提问于 2010-08-19 04:49:53
回答 4查看 500关注 0票数 3

我返回了数组

代码语言:javascript
复制
$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_array=array('AxA','B2B','C12')的新数组。

例如:

代码语言:javascript
复制
 if have $header_array=array('C12','B2B','AxA').

新的$header_html将是:

代码语言:javascript
复制
$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')

                      );

以此类推。

有人知道怎么做吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-19 04:58:41

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

代码语言:javascript
复制
function cmp($a, $b) {
  // Sort via $a['title'] and $b['title']
}

usort($header_html, 'cmp');

诀窍是想出一个能做你想做的事情的比较函数。要简单地按标题向后排序,您可以使用:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-08-19 05:05:46

在PHP5.3中,你可以使用functor和usort很容易做到这一点。

代码语言:javascript
复制
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;
  }
}

你可以这样使用它:

代码语言:javascript
复制
$sorter = new MyComparator('CCC', 'AAA', 'BBB');
usort($header_html, $sorter);
票数 2
EN

Stack Overflow用户

发布于 2010-08-19 05:07:15

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

代码语言:javascript
复制
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()成功时返回true,失败时返回false;它不返回重新排序的数组。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3516561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档