我有以下数组正在尝试排序。该值是最终输出数组中键应该位于的位置。
$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'
);
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
)