排序优先级为

时间:2017-08-06 20:59:58

标签: php arrays sorting

我有一个数组,这个数组包含未排序的值。

实施例。

$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_0KEY_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>";

1 个答案:

答案 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
)