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

PHP关联数组按上一个值排序,php,arrays,sorting,multidimensional-array,foreach,Php,Arrays,Sorting,Multidimensional Array,Foreach,我正在尝试对以下数组进行排序。该值是键在最终输出数组中的位置 $main=array( “lorem”=>“lorem”, “ipsum”=>“duis”, '坐'=>'告别', “duis”=>“sit”, “amet”=>“elit”, “Concertetur”=>“lorem”, “adipising”=>“concertetur”, “eiusmod”=>“ipsum”, 'labore'=>'eiusmod', “dolore”=>“labore”, “麦格纳”=>“多洛尔”, 'i

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

$main=array(
“lorem”=>“lorem”,
“ipsum”=>“duis”,
'坐'=>'告别',
“duis”=>“sit”,
“amet”=>“elit”,
“Concertetur”=>“lorem”,
“adipising”=>“concertetur”,
“eiusmod”=>“ipsum”,
'labore'=>'eiusmod',
“dolore”=>“labore”,
“麦格纳”=>“多洛尔”,
'incidiunt'=>'magna',
'tempor'=>'incidedunt',
‘sed’=>‘tempor’,
“Elite”=>“sed”,
“aliqua”=>“amet”
);
最终的输出是这样的

$final=array(
“lorem”=>“lorem”,
“Concertetur”=>“lorem”,
“adipising”=>“concertetur”,
'坐'=>'告别',
“duis”=>“sit”,
“ipsum”=>“duis”,
“eiusmod”=>“ipsum”,
'labore'=>'eiusmod',
“dolore”=>“labore”,
“麦格纳”=>“多洛尔”,
'incidiunt'=>'magna',
'tempor'=>'incidedunt',
‘sed’=>‘tempor’,
“Elite”=>“sed”,
“amet”=>“elit”,
“aliqua”=>“amet”
);
我一直试图用一种合适的方法来解决问题,但我似乎走错了路。我最终只得到了一些遵循正确规则的元素。你将如何处理这个问题?我尝试了很多方法来循环、拼接和搜索,但都没有成功

编辑:未清除的尝试

$final=array();
$main=array\u merge($current\u word\u types,$word\u types);
foreach($id=>$previousWord的main){
$final[$id]=$previousWord;
如果($id==$previousWord){
继续;
}
if(isset($word[$id])){
继续;
}
$previousKey=array\u search($previousWord,$main);
$previousKeyIndex=array_search($previousWord,array_keys($main));
$final=array\u slice($final,0,$previousKeyIndex,true)+
数组($previousKey=>$main[$previousKey])+
数组\u切片($word,$previousKeyIndex,NULL,true);
}
编辑2:以下是我从中构建的主列表
$main

//主订单列表
$word\u types=数组(
“lorem”=>“lorem”,
“ipsum”=>“lorem”,
'sit'=>'ipsum',
“duis”=>“sit”,
“amet”=>“duis”,
“Concertetur”=>“amet”,
“adipising”=>“concertetur”,
“eiusmod”=>“adipising”,
'labore'=>'eiusmod',
“dolore”=>“labore”,
“麦格纳”=>“多洛尔”,
'incidiunt'=>'magna',
'tempor'=>'incidedunt',
‘sed’=>‘tempor’,
“Elite”=>“sed”,
“aliqua”=>“elit”
);
//最终得到特殊订单处理的物品到期
//有人对单词重新排序,使$main输出符合需要
//为了弥补这一点。(有时可能会以空结尾)
$current\u word\u types=数组(
“lorem”=>“lorem”,
“Concertetur”=>“lorem”,
“duis”=>“Concertetur”,
“amet”=>“duis”,
“elit”=>“amet”
);

这里有一个函数,可以按照您想要的方式对数组进行排序。它基于@deceze算法(如问题注释中所述),使用查找不也是值的键,然后在数组中迭代,直到键与该键处的值匹配:

功能分类器($array){
//查找不具有匹配值的键
$unique=array\u diff(array\u键($array),$array);
$key=reset($unique);
$value=$array[$key];
$result=数组($key=>$value);
//向后跟随值,直到键与值匹配
而($key!=$value){
$key=$array[$key];
$value=$array[$key];
$result=数组($key=>$value)+$result;
}
返回$result;
}
为您的数据输出
print\r(分拣机($main))

数组
(
[lorem]=>lorem
[Concertetur]=>lorem
[ADIPISING]=>consectetur
[sit]=>再见
[酒后驾车]=>坐下
[ipsum]=>duis
[eiusmod]=>ipsum
[labore]=>eiusmod
[dolore]=>labore
[magna]=>dolore
[incidiunt]=>麦格纳
[tempor]=>incidUnt
[sed]=>tempor
[elit]=>sed
[amet]=>精英
[aliqua]=>amet
)

这里有一个函数,可以按照您想要的方式对数组进行排序。它基于@deceze算法(如问题注释中所述),使用查找不也是值的键,然后在数组中迭代,直到键与该键处的值匹配:

功能分类器($array){
//查找不具有匹配值的键
$unique=array\u diff(array\u键($array),$array);
$key=reset($unique);
$value=$array[$key];
$result=数组($key=>$value);
//向后跟随值,直到键与值匹配
而($key!=$value){
$key=$array[$key];
$value=$array[$key];
$result=数组($key=>$value)+$result;
}
返回$result;
}
为您的数据输出
print\r(分拣机($main))

数组
(
[lorem]=>lorem
[Concertetur]=>lorem
[ADIPISING]=>consectetur
[sit]=>再见
[酒后驾车]=>坐下
[ipsum]=>duis
[eiusmod]=>ipsum
[labore]=>eiusmod
[dolore]=>labore
[magna]=>dolore
[incidiunt]=>麦格纳
[tempor]=>incidUnt
[sed]=>tempor
[elit]=>sed
[amet]=>精英
[aliqua]=>amet
)

你只需要找到最后的一个元素(这里是:“aliqua”,它不包含在数组的值中),然后从这个元素开始。然后,只需按键(
$main['amet']
)即可获取上一个元素,并将其放置在数组的前面。冲洗,重复。请展示您迄今为止尝试过的一些代码工作?@deceze,很好的方法,我只想补充一点,也可以使用相反的方法。找到具有相同键和值的一个,并使用该起点获取下一个。现在您有了相同的方法,但是从上到下的。@Wimanicesir当然可以,但它需要重复搜索数组的值