Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按值对数组排序,保留键值不变_Php - Fatal编程技术网

Php 按值对数组排序,保留键值不变

Php 按值对数组排序,保留键值不变,php,Php,我正在浏览PHP数组排序函数,以找到执行以下操作的方法,但似乎无法管理它 范例 Array ( [77] => 79 [72] => 78 [71] => 78 [82] => 79 [76] => 79 [73] => 78 [75] => 78 ) 我想重新订购 Array ( [72] => 78 [71] => 78 [73] => 78 [75] => 78 [77] => 79 [82] => 79

我正在浏览PHP数组排序函数,以找到执行以下操作的方法,但似乎无法管理它

范例

Array ( 
[77] => 79
[72] => 78
[71] => 78
[82] => 79
[76] => 79
[73] => 78
[75] => 78 )
我想重新订购

Array ( 
[72] => 78
[71] => 78
[73] => 78
[75] => 78
[77] => 79
[82] => 79
[76] => 79 )
请注意,键的顺序与它们原来的顺序是一致的,它们只是根据值排列的(因此79中的第一个77仍然是79中的第一个,以此类推)

我原以为aasort会管用,但没用

asort($categories);
foreach ($categories as $key => $val) {
    echo "$key = $val\n";
    echo "<br>";
}

不熟悉PHP,所以不确定如何在PHP中使用它(也许这就是问题所在),但您可以创建第二个列表,如下所示:

[77] => (79,1)
[72] => (78,2)
[71] => (78,3)
[82] => (79,4)
[76] => (79,5)
[73] => (78,6)
[75] => (78,7)
function my_sort(&$array)
{
  $i = 0;
  foreach ($array as &$val)
    $val = [$i++, $val];

  uasort($array, function($a, $b) {
    return $a[1] - $b[1] ?: $a[0] - $b[0];
  });

  foreach ($array as &$val)
    $val = $val[1];
}

这是一个具有原始值和顺序值的元组。进行排序,然后删除每个的排序,以生成所需的格式。

不熟悉PHP,因此不确定如何在PHP中进行排序(也许这就是问题所在),但您可以创建第二个如下所示的列表:

[77] => (79,1)
[72] => (78,2)
[71] => (78,3)
[82] => (79,4)
[76] => (79,5)
[73] => (78,6)
[75] => (78,7)
function my_sort(&$array)
{
  $i = 0;
  foreach ($array as &$val)
    $val = [$i++, $val];

  uasort($array, function($a, $b) {
    return $a[1] - $b[1] ?: $a[0] - $b[0];
  });

  foreach ($array as &$val)
    $val = $val[1];
}

这是一个具有原始值和顺序值的元组。进行排序,然后删除每个排序的顺序,以生成所需的格式。

按照Mark的建议,可能会将其集成到冒泡排序的一些实现中,但在速度上会有一个折衷。如果速度不是一个问题,那么这里有一个简单的实现,它可以满足您的需求

它只是简单地统计特定值使用了哪些键,然后确保最终排序的数组遵循该顺序:

function sort_keys_intact(&$a) {
    $b = array();
    $values = array();
    foreach ( $a as $k => $v ) {
        $values[$v][] = $k;
    }
    asort($a);
    $used = 0;
    foreach ( $a as $k => $v ) {
        if ( $used == count($values[$v]) + 1 ) {
            $used = 0;
        }
        $b[$values[$v][$used]] = $v;
        $used++;
    }
    $a = $b;
}
试运行:

输出:


正如马克所建议的那样,很可能将其集成到一些冒泡排序的实现中,但在速度上会有一个折衷。如果速度不是一个问题,那么这里有一个简单的实现,它可以满足您的需求

它只是简单地统计特定值使用了哪些键,然后确保最终排序的数组遵循该顺序:

function sort_keys_intact(&$a) {
    $b = array();
    $values = array();
    foreach ( $a as $k => $v ) {
        $values[$v][] = $k;
    }
    asort($a);
    $used = 0;
    foreach ( $a as $k => $v ) {
        if ( $used == count($values[$v]) + 1 ) {
            $used = 0;
        }
        $b[$values[$v][$used]] = $v;
        $used++;
    }
    $a = $b;
}
试运行:

输出:


我会这样做:

[77] => (79,1)
[72] => (78,2)
[71] => (78,3)
[82] => (79,4)
[76] => (79,5)
[73] => (78,6)
[75] => (78,7)
function my_sort(&$array)
{
  $i = 0;
  foreach ($array as &$val)
    $val = [$i++, $val];

  uasort($array, function($a, $b) {
    return $a[1] - $b[1] ?: $a[0] - $b[0];
  });

  foreach ($array as &$val)
    $val = $val[1];
}
我认为这只是@Nuclearman答案的一个实现


这假设所有值都是整数。如果情况并非如此,则必须更改
$a[1]-$b[1]
以反映应如何对值进行排序。(如果值相同,则排序函数返回
$a[0]-$b[0]

我会这样做:

[77] => (79,1)
[72] => (78,2)
[71] => (78,3)
[82] => (79,4)
[76] => (79,5)
[73] => (78,6)
[75] => (78,7)
function my_sort(&$array)
{
  $i = 0;
  foreach ($array as &$val)
    $val = [$i++, $val];

  uasort($array, function($a, $b) {
    return $a[1] - $b[1] ?: $a[0] - $b[0];
  });

  foreach ($array as &$val)
    $val = $val[1];
}
我认为这只是@Nuclearman答案的一个实现


这假设所有值都是整数。如果情况并非如此,则必须更改
$a[1]-$b[1]
以反映应如何对值进行排序。(如果值相同,则排序函数返回
$a[0]-$b[0]

答案对我不起作用,因此我编写了一个函数来解决此问题:

function sort_value_leave_key(&$arr){

$z = array();
foreach ($arr as $k => $v){
    $z[$v.rand(1111,9999)] = $k;
}
krsort($z);

$arr = array();
foreach($z as $k => $v){
    $arr[$v] = substr($k,0,-4);
}

}

答案对我不起作用,所以我写了一个函数来解决这个问题:

function sort_value_leave_key(&$arr){

$z = array();
foreach ($arr as $k => $v){
    $z[$v.rand(1111,9999)] = $k;
}
krsort($z);

$arr = array();
foreach($z as $k => $v){
    $arr[$v] = substr($k,0,-4);
}

}

分类()保证按值排序并保留键,但不保证在任何特定的mannerA Quicksort is算法中对具有相同值的多个键进行排序,因为元素不是按排序顺序处理的,因此不利于处理此问题;您可能需要手动实现冒泡排序或合并排序之类的功能。是否有特定的原因需要按特定顺序使用它们?@BrianGlaz只是因为我已将它们按顺序排列,我不希望顺序混乱。本例中的值是父项,键是子项(我知道这很奇怪,但事实就是这样)。我需要按父项排序,并保持子项已经存在的排序顺序。schord()保证按值排序并保留密钥,但不能保证在任何特定的mannerA Quicksort is算法中都会对具有相同值的多个键进行排序,因为元素不是按排序顺序处理的,因此该算法不利于处理该问题;您可能需要手动实现冒泡排序或合并排序之类的功能。是否有特定的原因需要按特定顺序使用它们?@BrianGlaz只是因为我已将它们按顺序排列,我不希望顺序混乱。本例中的值是父项,键是子项(我知道这很奇怪,但事实就是这样)。我需要按家长排序,并保持孩子们已经有的排序顺序。速度在这里根本不是问题,永远也不会是问题。这个函数工作得很好,感谢这里的速度完全不是问题,永远也不会是问题。这个功能运行得很好,谢谢