Php排序多维数组

时间:2015-10-09 10:22:09

标签: php arrays sorting multidimensional-array

确定。我遇到了一些同样问题的帖子,但我仍然无法弄清楚如何对以下数组进行排序。

我有一个多维数组,每个品牌的总小时数

$totalHours = array(
                'brand'   => array(),
                'project' => array(),
                'hours'   => array()
            );

输出是这样的(项目未填充):

array(3) {
  ["brand"]=>
  array(3) {
    [0]=>
    string(4) "Nike"
    [1]=>
    string(9) "Coke Cola"
    [2]=>
    string(8) "Converse"
  }
  ["project"]=>
  array(3) {
    [0]=>
    string(6) "Bonobo"
    [1]=>
    string(4) "LDRU"
    [2]=>
    string(2) "US"
  }
  ["hours"]=>
  array(3) {
    [0]=>
    int(28)
    [1]=>
    int(106)
    [2]=>
    string(1) "2"
  }
}

现在我想基于“小时”字段对数组进行排序。

我已经尝试过array_multisort,但似乎我根本不知道这个函数是如何工作的以及如何将它应用于这个数组。 我只能用一行值对单个数组进行排序。如果我将此问题应用于此问题,我只对小时字段进行排序,使其他字段保持未排序状态,因此数组已损坏。

感谢任何帮助!

***编辑

“project”确实包含一个字符串。它总是这样。在这个例子中,我没有填写它。

3 个答案:

答案 0 :(得分:2)

array_multisort应该可以工作:

$totalHours = array(
  'brand' => array('Nike', 'Coke Cola', 'Converse'),
  'project' => array(),
  'hours' => array(28, 106, '2')
);

array_multisort($totalHours['hours'], $totalHours['brand']);

var_dump($totalHours);

答案 1 :(得分:1)

这种数据格式不是很方便,因为品牌和小时之间没有直接联系,他们甚至坐在不同的阵列中!另外,最后一小时是一个字符串,而不是整数。

我们必须创建一个中间数组来关联它们并对它们进行排序。然后我们将重新注入原始数组中的所有内容。

// Make sure both arrays of brands and hours and the same size
if (count($totalHours['brand']) != count($totalHours['hours'])) {
    throw new Exception('Invalid data!');
}

// Make sure every hour record is an integer, not a string
$totalHours['hours'] = array_map('intval', $totalHours['hours']);

// array_combine will sort all arrays based on the sorting of the first one
array_multisort($totalHours['hours'], $totalHours['brand'], $totalHours['project']);

编辑:最初使用array_multisort是@delprks的想法。在这里,我将它应用于品牌项目数组。

答案 2 :(得分:0)

你不能用一个数组_ * 函数来做到这一点!

如果(项目未填写)总是且品牌小时的索引相等,那么您可以这样做:

$forsort = array_combine($totalHours["brands"],$totalHours["hours"]);
asort($forsort,SORT_NUMERIC);
$totalHours["brands"]=array_keys($forsort);
$totalHours["hours"]=array_values($forsort);

但是,这只是你问题的答案,而不是最佳实践。