2010-08-18 3 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 = массив ('AXA', 'B2B', 'C12')

примеры:

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') 

        ); 

и так далее ...

Кто-нибудь знает, как это сделать?

+0

Итак, вы хотите отсортировать массив по убыванию в алфавитном порядке по '['title']'? –

+0

@adam, Из его примера, да. Но я думаю, что OP может нуждаться в функциональности, где вы можете предоставить аргументы о том, как переупорядочить массив и что я не думаю, что существует в одной функции. –

+0

Просто обновите вопрос .. Это не вопрос сортировки. Новый массив будет зависеть от $ header_array = array ('C12', 'B2B', 'AxA') или $ header_array = array ('B2B' , 'C112', 'AxA') и т. Д. – kn3l

ответ

2

Вы можете отсортировать массив с пользовательской функцией сравнения с использованием 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; 
} 
+0

usort() берет рефери и возвращает логическое значение – tamasd

+0

@Yorirou Спасибо. – meagar

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. –

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 при успешном выполнении или false при ошибке; он не возвращает возвращенный массив.

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