2011-05-03 80 views
1

我需要再次幫助。我有一個陣列,我需要提取最早的體重值。php多維數組獲取第一個日期值

編輯 - 編輯 - 編輯

 

array (
    3 => 
    array (
    'id' => '20110211', 
    'Date' => '2011-02-11', 
    'Weight' => '195', 
), 
    4 => 
    array (
    'id' => '20110213', 
    'Date' => '2011-02-13', 
    'Weight' => '160', 
), 
    6 => 
    array (
    'id' => '20110310', 
    'Date' => '2011-03-10', 
    'Weight' => '200', 
), 
    12 => 
    array (
    'id' => '20110301', 
    'Date' => '2011-03-01', 
    'Weight' => '55', 
), 
    21 => 
    array (
    'id' => '20110215', 
    'Date' => '2011-02-15', 
    'Weight' => '120', 
), 
    25 => 
    array (
    'id' => '20110322', 
    'Date' => '2011-03-22', 
    'Weight' => '250', 
), 
) 

我已經編輯這一點,此代碼的工作:

 

function sortByDate ($arr1, $arr2) 
{ 
    return strcmp($arr1['Date'], $arr2['Date']); 
} 
// $arr is your array 
usort($weight_tracker, 'sortByDate'); 
$earliest = $weight_tracker[0]['Weight']; 
echo $earliest; 

但自從我上有一個表格這個更新陣列時更新數組的頁面 - 我找到了我ssage致命錯誤:無法使用字符串偏移量作爲數組在

編輯 - >我已經重新聲明這是字符串,因此錯誤!使用全球時要小心,因爲一切都會變得一團糟! PHP是寬容,但 「寬恕」 以後可以在花費了大量的時間... :)

謝謝,
彼得

+0

這將是其他人更容易複製你代碼和解決方案,如果你在PHP中粘貼正確的數組而不是var_dump()的結果,這意味着我們必須自己輸出它們,只是說... – Cups 2011-05-03 15:25:00

+0

這可能是一個愚蠢的問題,但'$ weight_tracker'被意外地重新分配給一個字符串而不是數組在某些時候?如果這段代碼是錯誤發生的地方,聽起來像是因爲'$ weight_tracker'是一個字符串,它應該是一個數組。 – Wiseguy 2011-05-03 16:54:13

+0

在不相關的說明中,它看起來像大數組中的數字鍵是來自數據庫的記錄ID或其他東西。那些需要保存嗎?目前'usort()'將它們重新編號爲0,1,2等。如果您需要保留原始ID號碼,我會更新我的答案。 – Wiseguy 2011-05-03 16:56:36

回答

2

您可以使用usort()對自定義回調進行排序,然後取第一個元素。

// $arr is your array 
usort($arr, 'sortByDate'); 
$earliest = $arr[0]; 

function sortByDate ($arr1, $arr2) 
{ 
    return strcmp($arr1['Date'], $arr2['Date']); 
} 
+0

這個工程,但當頁面更新時,我得到致命錯誤:不能使用字符串偏移量作爲數組...我已經更新了問題 – Peter 2011-05-03 16:38:47

+0

@Peter我不明白這個代碼會導致這個錯誤。它是否來自你在它後面添加的東西?也許[這](http://informationideas.com/news/2006/06/14/fatal-error-cannot-use-string-offset-as-an-array-in/)將有所幫助。 – Wiseguy 2011-05-03 16:43:41

+0

太好了...我的壞 - 在一個包含的文件中,我已經重新聲明它爲字符串 - 感謝幫助! – Peter 2011-05-03 17:33:34

0
$smallest = null; // array index of entry with smallest weight. 
foreach ($array as $idx => $data) { 
    if (($data['Weight'] < $array[$smallest]['Weight']) || (is_null($smallest))) { 
     $smallest = $idx; // found a small weight, so save the index 
    } 
} 

echo $array[$smallest]['Date']; 
1

這是做這件事的一種方法:

function filter_min($a, $b) { 
    return ($a['Date'] < $b['date']) ? $a : $b; 
} 

$result = array_reduce($array, 'filter_min'); 
echo $result['Weight']; 

另一種方法是簡單地迭代數組並找到最小日期。

0

我注意到日期是相反的順序,最先的日期是先拉,最早的日期是最後一個。它會一直如此嗎?如果是這樣,你可以這樣做:

$index = count($array) - 1; 
$earliestdate = $array[$index]['Date']; 

你也可以使用array_reverse()反轉陣列中,並使第一個元素的原最後一個元素。

如果這是從MySQL拉到你也可以改變查詢ORDER BY 'Date' DESC(或者是ASC會得到你想要的,不記得是什麼)

+0

實際上,它們並不合適,但我同意在可能/適用的數據庫查詢中進行排序。 – Wiseguy 2011-05-03 15:43:23

+0

啊,你是對的,沒注意到02-05-2011是在02-10-2011之前 – Phoenix 2011-05-03 15:46:59