php – 优先排序数组
我有一个数组,这个数组包含未排序的值.
防爆. $Array_Raw=array('KEY_0'=>'550','KEY_1'=>'400','KEY_2'=>'800','KEY_3'=>'600','KEY_4'=>'450','KEY_5'=>'100'); 如果我们按升序排序$Array_Raw,那么我们有一个新的数组,如: array('KEY_5'=>'100','KEY_0'=>'550','KEY_2'=>'800'); 这可以通过asort()函数实现,但我需要优先级 $Array_P包含$Array_Raw键的优先级. $Array_P=array('KEY_0'=>'4','KEY_1'=>'5','KEY_2'=>'1','KEY_3'=>'6','KEY_4'=>'2','KEY_5'=>'3'); $Priority_Gap是包含优先级跳过间隙的变量(INT). 它可能是:$Priority_Gap = 60; 这意味着$Array_Raw应按升序排序,优先级为此预期结果: $Array_Raw=array('KEY_5'=>'100','KEY_2'=>'800'); KEY_4在KEY_1之前的原因是因为KEY_1 $Priority_Gap的值> KEY_4的值和KEY_4的优先级高于KEY_1. 然而,KEY_0和KEY_3保持它们的相对位置,因为KEY_0 $Priority_Gap的值> KEY_3的值,但KEY_0具有更高的优先级,因此KEY_0始终位于KEY_3之前. $Array_Raw的所有值都是动态的,$Array_P是动态的,$Priority_Gap是动态的.甚至$Array_Raw的大小也是动态的.此外,排序方向可以设置为升序或降序. 我一直试图这样做13天,只实现了动态$Array_Raw,$Array_P& $Priority_Gap,但无法找到$Array_Raw或动态订单的动态大小的任何方法. 这是我的解决方案,但未按动态大小排序 $array_raw = [ 'key_0' => 550,'key_1' => 400,'key_2' => 800,'key_3' => 600 ]; $array_p = [ 'key_0' => 2,'key_1' => 3,'key_2' => 1,'key_3' => 4 ]; $priority_gap = 500; function Sort_Array_Asc($ARRAY,$PRIORITY,$GAP) { if($ARRAY[$PRIORITY[0]] <= $ARRAY[$PRIORITY[1]] + $GAP ) { if($ARRAY[$PRIORITY[0]] <= $ARRAY[$PRIORITY[2]] + $GAP ) { if($ARRAY[$PRIORITY[0]] <= $ARRAY[$PRIORITY[3]] + $GAP ) { $VAL_COMP2 = $PRIORITY[0]; } else { if($ARRAY[$PRIORITY[2]] <= $ARRAY[$PRIORITY[3]] + $GAP ) { if($ARRAY[$PRIORITY[1]] <= $ARRAY[$PRIORITY[2]] + $GAP ) { $VAL_COMP2 = $PRIORITY[1]; } else { $VAL_COMP2 = $PRIORITY[2]; } } else { $VAL_COMP2 = $PRIORITY[3]; } } } else { if($ARRAY[$PRIORITY[2]] <= $ARRAY[$PRIORITY[3]] + $GAP ) { $VAL_COMP2 = $PRIORITY[2]; } else { if($ARRAY[$PRIORITY[2]] <= $ARRAY[$PRIORITY[3]] + $GAP ) { if($ARRAY[$PRIORITY[1]] <= $ARRAY[$PRIORITY[2]] + $GAP ) { $VAL_COMP2 = $PRIORITY[1]; } else { $VAL_COMP2 = $PRIORITY[2]; } } else { $VAL_COMP2 = $PRIORITY[3]; } } } } else { if($ARRAY[$PRIORITY[1]] <= $ARRAY[$PRIORITY[2]] + $GAP ) { if($ARRAY[$PRIORITY[1]] <= $ARRAY[$PRIORITY[3]] + $GAP ) { $VAL_COMP2 = $PRIORITY[1]; } else { if($ARRAY[$PRIORITY[2]] <= $ARRAY[$PRIORITY[3]] + $GAP ) { if($ARRAY[$PRIORITY[1]] <= $ARRAY[$PRIORITY[2]] + $GAP ) { $VAL_COMP2 = $PRIORITY[1]; } else { $VAL_COMP2 = $PRIORITY[2]; } } else { $VAL_COMP2 = $PRIORITY[3]; } } } else { if($ARRAY[$PRIORITY[2]] <= $ARRAY[$PRIORITY[3]] + $GAP ) { if($ARRAY[$PRIORITY[1]] <= $ARRAY[$PRIORITY[2]] + $GAP ) { $VAL_COMP2 = $PRIORITY[1]; } else { $VAL_COMP2 = $PRIORITY[2]; } } else { if($ARRAY[$PRIORITY[2]] <= $ARRAY[$PRIORITY[3]] + $GAP ) { if($ARRAY[$PRIORITY[1]] <= $ARRAY[$PRIORITY[2]] + $GAP ) { $VAL_COMP2 = $PRIORITY[1]; } else { $VAL_COMP2 = $PRIORITY[2]; } } else { $VAL_COMP2 = $PRIORITY[3]; } } } } return $VAL_COMP2; } function CompareArrays($ARRAY,$PRIORITYX,$GAP) { $PRIORITY = array(); asort($PRIORITYX); $count = 0; foreach($PRIORITYX as $key => $value) { $PRIORITY[$count] = $key; $count++; } $NEWARRAY = $ARRAY; $C1 = Sort_Array_Asc($NEWARRAY,$GAP); $NEWARRAY[$C1] = max($NEWARRAY) + ($GAP * 2) + 1; $C2 = Sort_Array_Asc($NEWARRAY,$GAP); $NEWARRAY[$C2] = max($NEWARRAY) + ($GAP * 2) + 1; $C3 = Sort_Array_Asc($NEWARRAY,$GAP); $NEWARRAY[$C3] = max($NEWARRAY) + ($GAP * 2) + 1; $C4 = Sort_Array_Asc($NEWARRAY,$GAP); return array($C1,$C2,$C3,$C4); } $SortedArray = CompareArrays($array_raw,$array_p,$priority_gap); echo "<br><br><br><br><pre>"; print_r($SortedArray); echo "</pre><br><br><br><br>"; 解决方法<?php $array_raw = [ 'key_0' => 550,'key_3' => 600,'key_4' => 450,'key_5' => 100,]; $array_p = [ 'key_0' => 4,'key_1' => 5,'key_3' => 6,'key_4' => 2,'key_5' => 3,]; $priority_gap = 60; asort($array_raw); /* the array is already sorted so i just keep values where $a<$b === 1. and using Boolean algebra and Karnaugh Map i get : $a<$b $pa<$pb $a+$pg>$b $r A B C 1 0 0 -1 1 0 1 -1 1 1 0 0 1 1 1 1 return -1 when : AB'C' + AB'C = AB' --> $va < $vb && $pa > $pb return 1 when : ABC --> $va < $vb && $pa < $pb && $a + $pg > $b return 0 when : ABC' --> $va < $vb && $pa < $pb && $a + $pg < $b */ uksort($array_raw,function($a,$b) use($array_p,$priority_gap,$array_raw) { $va = $array_raw[$a]; $vb = $array_raw[$b]; $pa = $array_p[$a]; $pb = $array_p[$b]; if($va < $vb && $pa < $pb) { return -1; } if($va < $vb && $pa > $pb && $va + $priority_gap > $vb) { return 1; } return 0; }); echo "<pre>"; print_r($array_raw); 输出: Array ( [key_5] => 100 [key_4] => 450 [key_1] => 400 [key_0] => 550 [key_3] => 600 [key_2] => 800 ) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |