如何在PHP中使用包含的关联数组的子字段对关联数组进行排序?

3
如何按照关联数组中的一个值对其进行排序?
例如:
$arr = array(
    'ted' => array( 'age' => 27 ),
    'bob' => array( 'age' => 18 ),
    'jay' => array( 'age' => 24 )
);

$arr = ???

foreach ($arr as $person)
    echo $person['age'], ', ';

因此输出结果是:

18, 24, 27

这只是一个过于简单的示例,只是为了展示我的问题。

我仍然需要$arr是一个关联数组。


4
如果您搜索栈,您会发现许多答案 http://stackoverflow.com/search?q=php+sort+associative+array - diagonalbatman
同样的问题在一个小时内已经被提出过了。 - Your Common Sense
没有冒犯 @Lea Hayes 的意思,只是在想为什么在SO上可以不了解这个网站的基本工作原理就提问。 - fabrik
2
对关联数组的排序不是重复的。 - chriso
1
+1 给 @chriso,正确识别了这里所问的内容,并迎着那些错误地将其标记为重复问题的反对者。如果不是你上面的评论,我就不会再逗留在这里,也不会找到答案来回答我自己非常相似的问题。非常感谢! - Dan Solo
@DanSolo,感谢您提出更准确的标题建议,我稍微调整了一下您的建议,因为我觉得强调我们正在按子字段排序很重要。虽然此页面上没有适当的示例,但我曾经想明确指出这也与对象数组有关。不过,编写排序回调以实现这一点实际上是相同的。 - Lea Hayes
5个回答

8
uasort() 函数允许您指定一个回调函数,该函数将负责在两个元素之间进行比较 - 因此,如果您实现了正确的回调函数,它应该可以正常工作。在这里,您需要实现一个回调函数,该函数将接收两个数组 - 并比较 age 项:
function callback($a, $b) {
  if ($a['age'] > $b['age']) {
    return 1;
  } else if ($a['age'] < $b['age']) {
    return -1;
  }
  return 0;
}


使用以下代码段中的该函数:

$arr = array(
    'ted' => array( 'age' => 27 ),
    'bob' => array( 'age' => 18 ),
    'jay' => array( 'age' => 24 )
);

uasort($arr, 'callback');
var_dump($arr);

你将获得以下结果数组:
array
  'bob' => 
    array
      'age' => int 18
  'jay' => 
    array
      'age' => int 24
  'ted' => 
    array
      'age' => int 27

你确定你的比较函数在所有情况下都能正确工作吗?根据手册,如果第一个参数被认为小于、等于或大于第二个参数,则比较函数必须返回一个整数小于、等于或大于零。 你的比较函数只返回 true,它将被转换为 1,或者 false,即 0 - Stefan Gehrig
@Stefan:呃;我应该重新阅读手册页面,并多想一会儿;我已经编辑了我的答案来修复它;感谢您的评论! - Pascal MARTIN

7
这是一个经典的例子,PHP 5.3匿名函数非常实用:
uasort($arr, function($a, $b) {
    return $a['age'] - $b['age'];
});

$a['age'] - $b['age'] 是一个小技巧。它的工作原理是,回调函数应该返回一个值 < 0 如果 $a$b 小,并且返回一个值 > 0 如果 $a$b 大。


1

由于您正在对子数组中的值进行排序,因此没有内置函数可以完成100%的工作。 我建议使用用户定义的排序:

http://www.php.net/manual/en/function.uasort.php

这是一个示例比较函数,它根据嵌套数组中的值返回其比较结果。
<?php
// Comparison function
function cmp($left, $right) {
    $age1 = $left['age'];
    $age2 = $right['age'];
    if ($age1 == $age2) {
        return 0;
    }
    return ($age1 < $age2) ? -1 : 1;
}

uasort($array, 'cmp');

1

0
你不仅仅是在排序一个关联数组,而是在排序一个关联数组的关联数组 ;)
你需要使用 uasort 函数。
uasort($array, function ($a, $b) {
    if ($a['age'] === $b['age']) {
        return 0;
    }
    return $a['age'] > $a['age'] ? 1 : -1;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接