сортировка части многомерного массива - PullRequest
0 голосов
/ 21 июля 2010

У меня есть многомерный массив:

$array[0] = array ( name => "Bob",
    position => "Chair",
    email => "bob@foo.bar"
);
$array[1] = array ( name => "Al",
    position => "",
    email => "al@foo.bar"
);
//etc..

Я хочу отсортировать это так, чтобы те, чья позиция! = "" Были первыми, затем остальные в алфавитном порядке по имени ... Я не очень знаком с сортировкой многомерных массивов, кто-то может мне помочь? Спасибо!

Ответы [ 3 ]

4 голосов
/ 22 июля 2010
<?php  
$array[0] = array ( name => "Bob", position => "Chair", email => "bob@foo.bar");  
$array[1] = array ( name => "Al", position => "",email => "al@foo.bar");  
print_r($array);  

$idxPos = array();  
for ($i=0;$i<count($array);$i++)
{  
    $idxPos[$i] = $array[$i]["position"]; 
}  
arsort($idxPos);  

$arrayNew = array();  
$sortedKeys = array_keys($idxPos);  
for($p=0;$p<count($idxPos);$p++)
{
$arrayNew[] = $array[$sortedKeys[$p]];
}
$array = $arrayNew;  

print_r("<br />");  
print_r($array);  
?>
1 голос
/ 22 июля 2010

Функция usort, вероятно, является лучшим выбором для этого:

usort($array, function($a, $b) {
    if (empty($a['position']) && !empty($b['position'])) {
        return 1; 
    }   
    else if (!empty($a['position']) && empty($b['position'])) {
        return -1;
    }   
    else {
        return strcmp($a['name'], $b['name']);
    }   
});

Анонимные функции были введены в PHP 5.3.0.Если вы используете более раннюю версию, вы можете просто определить обычную функцию:

function cmp($a, $b) {
    if (empty($a['position']) && !empty($b['position'])) {
        return 1; 
    }   
    else if (!empty($a['position']) && empty($b['position'])) {
        return -1;
    }   
    else {
        return strcmp($a['name'], $b['name']);
    }   
}

usort($array, 'cmp');
0 голосов
/ 21 июля 2010

Возможно, вы захотите попробовать usort, чтобы вы могли использовать пользовательскую функцию сортировки.В функции сортировки вы можете проверить [[position]] vs b [«position»] так, как вы описываете.

...