我有一个数组,这个数组包含未排序的值。
实施例。
$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_1'=>'400','KEY_4'=>'450',
'KEY_0'=>'550','KEY_3'=>'600','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_4'=>'450','KEY_1'=>'400',
'KEY_0'=>'550','KEY_3'=>'600','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,$PRIORITY,$GAP);
$NEWARRAY[$C1] = max($NEWARRAY) + ($GAP * 2) + 1;
$C2 = Sort_Array_Asc($NEWARRAY,$PRIORITY,$GAP);
$NEWARRAY[$C2] = max($NEWARRAY) + ($GAP * 2) + 1;
$C3 = Sort_Array_Asc($NEWARRAY,$PRIORITY,$GAP);
$NEWARRAY[$C3] = max($NEWARRAY) + ($GAP * 2) + 1;
$C4 = Sort_Array_Asc($NEWARRAY,$PRIORITY,$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>";
答案 0 :(得分:1)
<?php
$array_raw = [
'key_0' => 550,
'key_1' => 400,
'key_2' => 800,
'key_3' => 600,
'key_4' => 450,
'key_5' => 100,
];
$array_p = [
'key_0' => 4,
'key_1' => 5,
'key_2' => 1,
'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
)