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

How to sort associative array by column that contains previous id value?

我有这样的关联数组。键 prev 包含一个值以匹配前一项的 id 值。

prev0 时,它是第一项。

正确的顺序应该是索引 prev:

但我不知道如何实现。

$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;

您是说按 "pre" 订购吗?您需要 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" 个值排序。

您可以使用 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");

比较函数 returns 如果它们相等则为 0,如果 a 出现在 b 之前则为 -1,如果 b 出现在 [=13= 之前则为 1 ].您可以随心所欲地订购。 对你来说,它可能看起来像:

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

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

usort($data, "cmp");

我想这就是你想要做的:

<?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,从原始数组中删除该元素,并将该元素添加到我们的排序数组中。

你应该试试这个希望它能帮助你

$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));

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

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

eval.in

上查看 运行