2011-05-03 75 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