Php 基于两个键对关联数组排序

Php 基于两个键对关联数组排序,php,arrays,sorting,Php,Arrays,Sorting,我想通过将具有空值的数组记录推到底部来对id字段进行排序。如果存在id值,则按asc对列1进行排序 我有一个这样的多维数组 Array ( [0]=> Array ( [id]=>1166 [col_1]=>9.4 ) [1]=> Array ( [id]=> [col_1]=>2.4 ) [2]=>

我想通过将具有空值的数组记录推到底部来对id字段进行排序。如果存在id值,则按asc对列1进行排序

我有一个这样的多维数组

Array
(
  [0]=> Array
        (
          [id]=>1166
          [col_1]=>9.4
        )
  [1]=> Array
        (
          [id]=>
          [col_1]=>2.4
        )
  [2]=> Array
        (
          [id]=>1012
          [col_1]=>0.96
        )
  [3]=> Array
        (
          [id]=>1856
          [col_1]=>7.47
        )
)
我想按id和列1对其进行排序。 我试过了

foreach ($arr as $key => $row) {
  $x[$key]  = $row['id'];
  $y[$key]  = $row['col_1'];
}
array_multisort($x, SORT_DESC, $y, SORT_ASC, $arr);
我得到了以下结果

Array
(
  [0]=> Array
        (
          [id]=>1856
          [col_1]=>7.47
        )
  [1]=> Array
        (
          [id]=>1166
          [col_1]=>9.4
        )
  [2]=> Array
        (
          [id]=>1012,
          [col_1]=>0.96
        )
  [3]=> Array
        (
          [id]=>
          [col_1]=>2.47
        )
)
但我希望结果是

Array
(
  [0]=> Array
        (
          [id]=>1012
          [col_1]=>0.96
        )
  [1]=> Array
        (
          [id]=>1856
          [col_1]=>7.47
        )
  [2]=> Array
        (
          [id]=>1166
          [col_1]=>9.4
        )
  [3]=> Array
        (
          [id]=>
          [col_1]=>2.4
        )
)

对于某些记录,“id”字段也可以为空。但是col_1将用于所有记录。

您可以使用usort函数进行自定义排序

 function customSort($a, $b) {
    if (null === $a['id'] && null === $b['id']) {
        return 0;
    }
    if (null === $a['id']) {
        return 1;
    } 
    if (null === $b['id']) {
        return -1;
    }
    return ($a['col_1'] < $b['col_1']) ? -1 : 1;
}

$array = [
    [
        'id' => 1012,
        'col_1' => 0.96
        ],
    [
        'id' => 1856,
        'col_1' => 7.47
        ],
            [
        'id' => null,
        'col_1' => 2.4
        ],
    [
        'id' => 1166,
        'col_1' => 9.4
        ],

    ];



    usort($array, 'customSort');
    print_r($array);

这正是你所期望的。希望这能有所帮助。

不太复杂,但可读性强,直截了当:

<?php
$data = [
    [
        'id' => 1166,
        'col_1' => 9.4
    ],
    [
        'id' => null,
        'col_1' => 2.4
    ],
    [
        'id' => 1012,
        'col_1' => 0.96
    ],
    [
        'id' => 1856,
        'col_1' => 7.47
    ]
];
usort($data, function($a, $b) {
    return ($a['col_1']>$b['col_1']);
});
usort($data, function($a) {
    return !isset($a['id']);
});
print_r($data);

在下面的评论中,您现在提出了一个附加要求。我怀疑是否有一种直接的方法可以用直接的排序方法来评估这两种需求。那么,为什么不尝试一种可读且显而易见的方法呢:

<?php
$data = [
    [
        'id' => 1166,
        'col_1' => 9.4
    ],
    [
        'id' => null,
        'col_1' => 2.4
    ],
    [
        'id' => null,
        'col_1' => 0.2
    ],
    [
        'id' => 1012,
        'col_1' => 0.96
    ],
    [
        'id' => null,
        'col_1' => 12
    ],
    [
        'id' => 1856,
        'col_1' => 7.47
    ]
];
usort($data, function($a, $b) {
    return ($a['col_1']>$b['col_1']);
});
$withId = array_filter($data, function($entry) {
    return isset($entry ['id']);
});
$withoutId = array_filter($data, function($entry) {
    return !isset($entry ['id']);
});
$data = array_merge($withId, $withoutId);
print_r($data);

您的预期结果没有以我能识别的任何方式进行排序。如果id字段不为空,则预期结果在asc中按col_1进行排序。如果id为null,则将其推到$a,$b指的是我的$x和$y吗?@kishram不,不是真的。看看
usort()
函数的文档,你就会明白它们的含义:为什么要进行两次排序?@kishram我添加了一个变体,它可能与你想要的一样…@bansi,因为它是最容易阅读和遵循的方法。因为我是个差劲的程序员。:-)而且,事实上,因为你需要一个两遍的算法来实现这一点……这非常有效。但我有一个小问题。我可能有两个以上id为空的记录。我希望这些记录按此顺序下面的列1排序。只需替换
返回0
返回($a['col_1']<$b['col_1'])-1 : 1;您应该完成;)
Array
(
    [0] => Array
        (
            [id] => 1012
            [col_1] => 0.96
        )

    [1] => Array
        (
            [id] => 1856
            [col_1] => 7.47
        )

    [2] => Array
        (
            [id] => 1166
            [col_1] => 9.4
        )

    [3] => Array
        (
            [id] =>
            [col_1] => 2.4
        )

)
<?php
$data = [
    [
        'id' => 1166,
        'col_1' => 9.4
    ],
    [
        'id' => null,
        'col_1' => 2.4
    ],
    [
        'id' => null,
        'col_1' => 0.2
    ],
    [
        'id' => 1012,
        'col_1' => 0.96
    ],
    [
        'id' => null,
        'col_1' => 12
    ],
    [
        'id' => 1856,
        'col_1' => 7.47
    ]
];
usort($data, function($a, $b) {
    return ($a['col_1']>$b['col_1']);
});
$withId = array_filter($data, function($entry) {
    return isset($entry ['id']);
});
$withoutId = array_filter($data, function($entry) {
    return !isset($entry ['id']);
});
$data = array_merge($withId, $withoutId);
print_r($data);
Array
(
    [0] => Array
        (
            [id] => 1012
            [col_1] => 0.96
        )

    [1] => Array
        (
            [id] => 1856
            [col_1] => 7.47
        )

    [2] => Array
        (
            [id] => 1166
            [col_1] => 9.4
        )

    [3] => Array
        (
            [id] =>
            [col_1] => 0.2
        )

    [4] => Array
        (
            [id] =>
            [col_1] => 2.4
        )

    [5] => Array
        (
            [id] =>
            [col_1] => 12
        )

)