2010-08-18 76 views
3

我返回数组动态关联数组?

$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新数组=阵列( '安盛', 'B2B', '12')

的例子:

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

新的$ HEADER_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') 

        ); 

等等...

任何人都知道如何做到这一点?

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

usort($header_html, 'cmp'); 

诀窍是想出一个比较函数,你想要做什么:

+0

所以,你想按字母顺序降序排列数组'''标题']'? – 2010-08-18 20:58:34

+0

@adam,从他的例子来看,是的。但我认为OP可能需要一个功能,可以提供如何重新排列数组的参数,并且我不认为存在于单个函数中。 – 2010-08-18 21:03:24

+0

只是更新问题.. 它不是排序的问题。新的数组将取决于 $ header_array = array('C12','B2B','AxA')或 $ header_array = array('B2B' ,'C112','AxA')等等。 – kn3l 2010-08-18 21:07:24

回答

2

您可以使用usort自定义的比较函数对数组进行排序。为了简单地按标题排序向后,你可以使用:

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; 
} 
+0

usort()需要一个引用并返回一个布尔值 – tamasd 2010-08-18 21:01:47

+0

@Yorirou谢谢。 – meagar 2010-08-18 21:02:41

2

在PHP 5.3,你可以轻松地用一个仿函数和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); 
+0

巧妙地使用'__invoke()',但应该强调的是,这在PHP pior 5.3中不起作用。 – 2010-08-18 21:08:35

2

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

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;它不会返回求助数组。

1

听起来好像你想要一个函数以你在$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; 
}