lin*_*ndy 6 php arrays comparison
我试着缩短我的问题,但这是我能做的最好的.既然我觉得很难理解我的需要,我会提供一个例子:
说我有以下数组:
$var = array(
array(1, 2, 3),
array(1, 3),
array(1, 2, 4, 3),
array(1, 3, 4)
);
Run Code Online (Sandbox Code Playgroud)
我想要的是从中删除所有数组$var,其中第一个和最后一个元素与另一个数组相同,$var但元素多于后者.
所以,下面的阵列应删除:(1, 2, 3)而且(1, 2, 4, 3)因为他们都开始1和结束3,并有更多的元素比(1, 3),这也开始,以1和3.(1, 3, 4)应该保留,因为没有其他数组以其开头1和结尾,4并且元素少于它.
无论是在内存还是时间方面,我都在寻找最有效的方法.$var可能有多达100个数组,每个单独的数组最多可包含10个元素.我想在所有两个元素之间进行某种比较(for(i=0;...) for(j=i+1;...) complexCompareFunction();),但我相信这不是很有效.
总的来说,是的,您太担心效率了(正如您在另一条评论中想知道的那样)。尽管 PHP 不是最快的语言,但我建议构建最简单的解决方案,并且只在最终结果存在明显问题时才担心优化或简化它。
这就是我会做的,从我的头脑中。它基于 ajreal 的答案,但希望会更容易遵循,并捕获该答案错过的一些边缘情况:
// Assume $var is the array specified in your question
function removeRedundantRoutes( $var ){
// This line sorts $var by the length of each route
usort( $var, function( $x, $y ){ return count( $x ) - count( $y ); } );
// Create an empty array to store the result in
$results = array();
// Check each member of $var
foreach( $var as $route ){
$first = $route[0];
$last = $route[ count( $route ) - 1 ];
if( !array_key_exists( "$first-$last", $results ) ){
// If we have not seen a route with this pair of endpoints already,
// it must be the shortest such route, so place it in the results array
$results[ "$first-$last" ] = $route;
}
}
// Strictly speaking this call to array_values is unnecessary, but
// it would eliminate the unusual indexes from the result array
return array_values( $results );
}
Run Code Online (Sandbox Code Playgroud)