2010-06-29 65 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; 

排序,你可以使用裝飾/排序/去除裝飾模式:

$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 2010-06-29 23:52:20

+0

終於有人讚賞它!我從python那裏學到了它,並且試圖將它隱藏到我對PHP問題的幾個答案中,但是到目前爲止,人們並不喜歡它。可能他們不想理解它是如何工作的。 usort()更簡單,但我認爲至少在某些情況下(可能是大多數?)它可能會更慢 – 2010-06-30 01:19:37

-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 2010-06-29 22:22:17

+0

當我嘗試 「$數組[0] [」 距離「] = 100;」結果是:「不能使用類型爲stdClass的對象作爲數組」 – cateye 2010-06-29 22:25:33

+0

我認爲你應該使用usort()而不是uasort()...鍵和對象之間的關聯似乎與asker給出的示例中不相關。 – 2010-06-29 22:25:59

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