如何按包含先前id值的列对关联数组进行排序?

时间:2017-02-24 22:01:01

标签: php arrays sorting associative-array

我有这样的关联数组。键上架包含一个值,用于匹配上一项的 id 值。

上架 0 时,它就是第一项。

正确的顺序应该是索引 prev

  • $数据[3]
  • $数据[1]
  • $数据[0]
  • $数据[4]
  • $ data [2]

但我不知道如何实现这一目标。

$data[0]['id'] = 10;
$data[0]['name'] = 'Zoe';
$data[0]['prev'] = 20;

$data[1]['id'] = 20;
$data[1]['name'] = 'Tom';
$data[1]['prev'] = 40;

$data[2]['id'] = 30;
$data[2]['name'] = 'Andy';
$data[2]['prev'] = 50;

$data[3]['id'] = 40;
$data[3]['name'] = 'Kathy';
$data[3]['prev'] = 0;

$data[4]['id'] = 50;
$data[4]['name'] = 'Barbara';
$data[4]['prev'] = 10;

5 个答案:

答案 0 :(得分:0)

你是说“预售”的顺序吗?你想要PHP的usort()函数:

<?php

$data = array();

$data[0]['id'] = 10;
$data[0]['name'] = 'Zoe';
$data[0]['prev'] = 20;

$data[1]['id'] = 20;
$data[1]['name'] = 'Tom';
$data[1]['prev'] = 40;

$data[2]['id'] = 30;
$data[2]['name'] = 'Andy';
$data[2]['prev'] = 50;

$data[3]['id'] = 40;
$data[3]['name'] = 'Kathy';
$data[3]['prev'] = 0;

$data[4]['id'] = 50;
$data[4]['name'] = 'Barbara';
$data[4]['prev'] = 10;

function my_order($a,$b) {

   return $a['prev'] > $b['prev'];
}

usort($data, "my_order");

print_r($data); //Kathy, Barbara, Zoe, Tom, Andy

使用函数“my_order”将$ data [$ x] ['prev']与$ data [$ x + 1] ['prev']进行比较,您可以得出按“prev”值排序的结果数组。

答案 1 :(得分:0)

您可以使用PHPusort功能来执行此操作。它将数组作为第一个参数,然后将比较函数作为第二个参数。来自文档:

function cmp($a, $b){
    if ($a == $b) {
        return 0;
    }

    return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

如果比较函数等效,则返回0;如果ab之前,则返回-1;如果ba之前,则返回1。您可以随意订购。 对你而言,它可能看起来像:

function cmp($a, $b){
    if ($a['prev'] == $b['prev']) {
        return 0;
    }

    return ($a['prev'] < $b['prev']) ? -1 : 1;
}

usort($data, "cmp");

答案 2 :(得分:0)

我认为这就是你想要做的事情:

<?php

$data = array();

$data[0]['id'] = 10;
$data[0]['name'] = 'Zoe';
$data[0]['prev'] = 20;

$data[1]['id'] = 20;
$data[1]['name'] = 'Tom';
$data[1]['prev'] = 40;

$data[2]['id'] = 30;
$data[2]['name'] = 'Andy';
$data[2]['prev'] = 50;

$data[3]['id'] = 40;
$data[3]['name'] = 'Kathy';
$data[3]['prev'] = 0;

$data[4]['id'] = 50;
$data[4]['name'] = 'Barbara';
$data[4]['prev'] = 10;

$nextId = 0;
$results = array();

while (count($data) > 0) {
    $matchFound = false;

    foreach ($data as $key=>$val) {
        if ($val['prev'] === $nextId) {
            $results[] = $val;
            $nextId = $val['id'];
            unset($data[$key]);
            $matchFound = true;
            break;
        }
    }

    if (!$matchFound) break;

}

外部while循环检查$data数组是否仍有元素。内部for循环搜索元素'prev'等于我们要查找的$nextId的数组(最初设置为0)。当它找到它时,它会将id分配给$next,从原始数组中删除该元素,并将该元素添加到我们的排序数组中。

答案 3 :(得分:0)

你应该尝试这个希望它可以帮助你

$data = array();
$data[0]['id'] = 10;
$data[0]['name'] = 'Zoe';
$data[0]['prev'] = 20;

$data[1]['id'] = 20;
$data[1]['name'] = 'Tom';
$data[1]['prev'] = 40;

$data[2]['id'] = 30;
$data[2]['name'] = 'Andy';
$data[2]['prev'] = 50;

$data[3]['id'] = 40;
$data[3]['name'] = 'Kathy';
$data[3]['prev'] = 0; 

$data[4]['id'] = 50;
$data[4]['name'] = 'Barbara';
$data[4]['prev'] = 10;

function sortIt($data) {
 $output = array();
 $key = array_search(0, array_column($data, 'prev'));
 $output[] = $data[$key];
 unset($data[$key]);
 $data = array_combine(
   array_column($data,'prev'),
   $data
 );
 while($data){
   $last = end($output);
   $output[] = $data[$last['id']];
   unset($data[$last['id']]);
 }
 return $output;
}
echo '<pre>';
print_r(sortIt($data));

答案 4 :(得分:0)

使用哈希可以获得更好的响应时间:

foreach($data as $rec) {
    $hash[$rec["prev"]] = $rec;
}
$id = "0";
while (isset($hash[$id])) {
    $result[] = $curr = $hash[$id];
    $id = $curr["id"];
}

eval.in

上查看它