PHP 关联数组按前一个值排序

问题描述 投票:0回答:2

我有以下数组正在尝试排序。该值是最终输出数组中键应该位于的位置。

$main = array(
    'lorem' => 'lorem',
    'ipsum' => 'duis',
    'sit' => 'adipiscing',
    'duis' => 'sit',
    'amet' => 'elit',
    'consectetur' => 'lorem',
    'adipiscing' => 'consectetur',
    'eiusmod' => 'ipsum',
    'labore' => 'eiusmod',
    'dolore' => 'labore',
    'magna' => 'dolore',
    'incididunt' => 'magna',
    'tempor' => 'incididunt',
    'sed' => 'tempor',
    'elit' => 'sed',
    'aliqua' => 'amet'
);

最终输出是这样的。

$final = array(
    'lorem' => 'lorem',
    'consectetur' => 'lorem',
    'adipiscing' => 'consectetur',
    'sit' => 'adipiscing',
    'duis' => 'sit',
    'ipsum' => 'duis',
    'eiusmod' => 'ipsum',
    'labore' => 'eiusmod',
    'dolore' => 'labore',
    'magna' => 'dolore',
    'incididunt' => 'magna',
    'tempor' => 'incididunt',
    'sed' => 'tempor',
    'elit' => 'sed',
    'amet' => 'elit',
    'aliqua' => 'amet'
);

我一直在努力寻找适当的方法,但我似乎走上了错误的道路。我总是最终只得到一些遵循正确规则的元素。你会如何解决这个问题?我尝试了多种方式循环、拼接和搜索,但没有成功。

编辑:未清理的尝试

$final = array();

$main = array_merge($current_word_types, $word_types);

foreach ($main as $id => $previousWord) {
    $final[$id] = $previousWord;

    if ($id === $previousWord) {
        continue;
    }

    if (isset($word[$id])) {
        continue;
    }

    $previousKey = array_search($previousWord, $main );
    $previousKeyIndex = array_search($previousWord, array_keys($main ));

    $final = array_slice($final, 0, $previousKeyIndex, true) +
                array($previousKey => $main [$previousKey]) +
                array_slice($word, $previousKeyIndex, NULL, true);
}

编辑 2:这是我从

$main
构建的主列表

// master ordering list $word_types = array( 'lorem' => 'lorem', 'ipsum' => 'lorem', 'sit' => 'ipsum', 'duis' => 'sit', 'amet' => 'duis', 'consectetur' => 'amet', 'adipiscing' => 'consectetur', 'eiusmod' => 'adipiscing', 'labore' => 'eiusmod', 'dolore' => 'labore', 'magna' => 'dolore', 'incididunt' => 'magna', 'tempor' => 'incididunt', 'sed' => 'tempor', 'elit' => 'sed', 'aliqua' => 'elit' ); // items that ended up getting special order treatment due // someone reordering the words so the $main output to needs // to compensate for this. (this could end up empty at times) $current_word_types = array( 'lorem' => 'lorem', 'consectetur' => 'lorem', 'duis' => 'consectetur', 'amet' => 'duis', 'elit' => 'amet' );
    
php arrays sorting multidimensional-array foreach
2个回答
3
投票
这是一个可以按照您想要的方式对数组进行排序的函数。它基于 @deceze 算法(在问题的评论中描述),使用

array_diff

 查找不是值的键,然后迭代数组直到键与该键处的值匹配:

function sorter($array) { // find the key which doesn't have a matching value $unique = array_diff(array_keys($array), $array); $key = reset($unique); $value = $array[$key]; $result = array($key => $value); // follow the values backwards until the key matches the value while ($key != $value) { $key = $array[$key]; $value = $array[$key]; $result = array($key => $value) + $result; } return $result; }
为您的数据输出 

print_r(sorter($main))

Array ( [lorem] => lorem [consectetur] => lorem [adipiscing] => consectetur [sit] => adipiscing [duis] => sit [ipsum] => duis [eiusmod] => ipsum [labore] => eiusmod [dolore] => labore [magna] => dolore [incididunt] => magna [tempor] => incididunt [sed] => tempor [elit] => sed [amet] => elit [aliqua] => amet )

3v4l.org 上的演示


0
投票
从数组的前面开始,使用循环来播种结果数组中的第一个元素并填充映射数组。

使用第二个循环按所需顺序填充结果数组。 (

演示) (或者没有 isset() 调用

foreach ($main as $k => $v) { if ($k === $v) { $result[$k] = $v; $key = $k; } else { $map[$v] = $k; } } while (isset($map[$key])) { $result[$map[$key]] = $key; $key = $map[$key]; } var_export($result);
    
© www.soinside.com 2019 - 2024. All rights reserved.