[英]Usort sort multidimensional array by continuing values
我有一个数组:
$cards = [
[
"from" => "Barcelona",
"to" => "Gerona Airport",
],
[
"from" => "Stockholm",
"to" => "New York JFK",
],
[
"from" => "Gerona Airport",
"to" => "Stockholm",
],
[
"from" => "Madrid",
"to" => "Barcelona",
]
];
我需要对它进行排序,使持续的旅程,其中from
匹配前面to
,或者被设定为开始如果不是,如:
Array (
[0] => Array ( [from] => Madrid [to] => Barcelona )
[1] => Array ( [from] => Barcelona [to] => Gerona Airport )
[2] => Array ( [from] => Gerona Airport [to] => Stockholm )
[3] => Array ( [from] => Stockholm [to] => New York JFK )
)
我正在尝试使用usort
:
usort($cards, function ($a, $b) {
return ( $a["to"] === $b["from"] ) ? -1 : 1;
});
print_r($cards);
但它并没有按照描述的方式排序。 有任何想法吗?
希望有一个更好的解决方案,但如果你排序的次数与数组中的元素一样多,并返回相等或更大,那么它的工作原理; 即使你不知道开头或开头不是第一个元素。 由于usort
遍历和比较的方式,返回相等或更少不起作用:
foreach($cards as $card) {
usort($cards, function ($a, $b) {
return ( $a["to"] === $b["from"] ) ? 0 : 1;
});
}
它可以使用较少的迭代,但是将每个迭代与所有其他迭代相比似乎是安全的。
您可以采用递归方法并指定要从哪个城市开始。
默认情况下,你从马德里开始使用doSort($cards, $result);
。
如果你想从“赫罗纳机场”继续旅行,你可以用doSort($cards, $result, "Gerona Airport");
$cards = [
[
"from" => "Barcelona",
"to" => "Gerona Airport",
],
[
"from" => "Stockholm",
"to" => "New York JFK",
],
[
"from" => "Gerona Airport",
"to" => "Stockholm",
],
[
"from" => "Madrid",
"to" => "Barcelona",
]
];
$result = [];
function doSort($cards, &$result, $start = "Madrid") {
foreach ($cards as $key => $card) {
if ($card["from"] === $start) {
$result[] = $card;
doSort($cards, $result, $card["to"]);
}
}
}
doSort($cards, $result);
print_r($result);
那会给你:
Array
(
[0] => Array
(
[from] => Madrid
[to] => Barcelona
)
[1] => Array
(
[from] => Barcelona
[to] => Gerona Airport
)
[2] => Array
(
[from] => Gerona Airport
[to] => Stockholm
)
[3] => Array
(
[from] => Stockholm
[to] => New York JFK
)
)
这是一种方式。 通过迭代找到开始并搜索路径:
// 1. Find the start
$start = null;
$starts = array_column($cards,'from');
$ends = array_column($cards,'to');
foreach ($cards as $card) {
if (!in_array($card['from'], $ends)) $start=$card;
}
// 2. Find way
$way=[$start];
while (count($cards)>1) {
$found = false ;
foreach ($cards as $k => $card) {
if ($card['from'] == $start['to']) {
$way[] = $card;
$start = $card;
unset($cards[$k]);
$found = true ;
break 1;
}
}
if (!$found) { echo "Impossible to use all cards.\n" ; break ; }
}
print_r($way);
输出:
Array (
[0] => Array ([from] => Madrid [to] => Barcelona )
[1] => Array ([from] => Barcelona [to] => Gerona Airport )
[2] => Array ([from] => Gerona Airport [to] => Stockholm )
[3] => Array ([from] => Stockholm [to] => New York JFK )
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.