2010-06-29 2 views
0
array(2) { 
    [0]=> 
    object(stdClass)#144 (2) { 
    ["id"]=> 
    string(1) "2" 
    ["name"]=> 
    string(5) "name1" 
    } 
    [1]=> 
    object(stdClass)#145 (2) { 
    ["id"]=> 
    string(1) "4" 
    ["name"]=> 
    string(5) "name2" 
    } 
} 

Я хочу добавить ключ и значение (например [distance] = 100;) к объектам в массиве. После этого я хочу сортировать значения расстояния. Как я могу это достичь?Манипулирование многомерным массивом в PHP?

ответ

1

Чтобы получить структуру, такие, как ваши вы можете сделать:

$arr = array(); 
$arr[0]->id = "2"; 
$arr[0]->name = "name1"; 
$arr[1]->id = "4"; 
$arr[1]->name = "name2"; 

Чтобы добавить "расстояние" вы можете сделать:

$arr[0]->distance = 100; 
$arr[1]->distance = 200; 

Для сортировки можно использовать Украсьте/сортировки/undecorate образец:

$arr = array_map(create_function('$o', 'return array($o->distance, $o);'), $arr); // transform array of objects into array of arrays consisted of sort key and object 
sort($arr); // sort array of arrays 
$arr = array_map('end', $arr); // take only last element from each array 

Или вы можете использовать u сортировки() с пользовательской функцией сравнения, как это:

function compareDistanceFields($a, $b) { 
    return $a->distance - $b->distance; 
} 
usort($arr, "compareDistanceFields"); 
+0

Отделка/сортировка/декорация рисунка отлично работает (и быстро)! Благодаря! – cateye

+0

Наконец-то кто-то оценил это! Я узнал об этом из python и попытался проникнуть в мои ответы на php-вопросы, но людям это пока не понравилось. Вероятно, они не хотели беспокоиться о том, как это работает. usort() проще, но я думаю, что по крайней мере в некоторых случаях (может быть, большинство?) это может быть медленнее –

-1

У вас здесь массив хэшей; то есть каждый элемент вашего массива является хешем (структура, содержащая элементы, каждая из которых идентифицируется ключом).

Для того, чтобы добавить ключ и значение, вы просто присвоить его, как это:

$array[0]["distance"]=100; 
$array[1]["distance"]=300; 
#and so on 

PHP хэши и массивы в целом задокументированы here.

Теперь, чтобы отсортировать массив (каждый из элементов которого является хэшем), вам нужно использовать функцию «uasort», которая позволяет вам определить функцию сравнения; в этой функции сравнения вы определяете поведение, которое хотите, которое сортирует по значению ключа расстояния.

Что-то вроде этого:

// Comparison function, this compares the value of the "distance" key 
// for each of the two elements being compared. 
function cmp($a, $b) { 
    if ($a["distance"] == $b["distance"]) { 
     return 0; 
    } 
    return ($a["distance"] < $b["distance"]) ? -1 : 1; 
} 

После того, как это определено, вы называете uasort как это:

uasort($array, 'cmp'); 

Найти больше документации на uasort here.

+0

Элементы его массива являются объекты, мы должны использовать '->', а не '[]' – a1ex07

+0

Когда я пытаюсь "$ массив [0] [" расстояние "] = 100;" Результат: «Нельзя использовать объект типа stdClass в качестве массива» – cateye

+0

Я думаю, вы должны использовать usort() not uasort() ... Ассоциация между ключами и объектами не кажется релевантной, приведенной в примере, заданном пользователем. –

0
$my_array[0]->distance = 100; 
$my_array[0]->distance = 101; 

usort($my_array, "cmp"); 
function cmp($a, $b) 
{ 
    if ($a->distance == $b->distance) 
    return 0; 
    return ($a->distance > $b->distance) ? 1: -1; 
} 
Смежные вопросы