PHP按子数组值排序数组

PHP按子数组值排序数组,php,arrays,sorting,Php,Arrays,Sorting,我有以下数组结构: Array ( [0] => Array ( [configuration_id] => 10 [id] => 1 [optionNumber] => 3 [optionActive] => 1

我有以下数组结构:

Array
        (
            [0] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )
根据
选项编号
,以增量方式订购阵列的最佳方式是什么

因此,结果如下所示:

Array
        (
            [0] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )
使用


在PHP中≥5.3,您应该使用以下选项:

请注意,上面的两个代码都假定
$a['optionNumber']
是一个整数。如果它们是字符串,则使用


在PHP中≥7.0中,使用而不是减法来防止溢出/截断问题

usort($array, function ($a, $b) {
    return $a['optionNumber'] <=> $b['optionNumber'];
});
usort($array,function($a,$b){
返回$a['optionNumber']$b['optionNumber'];
});
使用
usort

 usort($array, 'sortByOption');
 function sortByOption($a, $b) {
   return strcmp($a['optionNumber'], $b['optionNumber']);
 }

当使用类似于上述功能时,这些键将被移除。如果这些键很重要,以下功能将对其进行维护。。。但是foreach循环效率很低

function subval_sort($a,$subkey) {
    foreach($a as $k=>$v) {
        $b[$k] = strtolower($v[$subkey]);
    }
    asort($b);
    foreach($b as $key=>$val) {
        $c[$key] = $a[$key];
    }
    return $c;
}
$array = subval_sort($array,'optionNumber');
如果希望从高到低,请使用arsort而不是asort

代码学分:

PHP5.3+

usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];} );
我使用了和的两种解决方案,并提出了一个函数,该函数可以在许多情况下帮助解决此问题,例如使用ASC或DESC排序或保留键,或者如果您将对象作为数组的子对象

以下是此函数(适用于PHP7及更高版本,因为有太空船操作员):


编辑

第一部分可以使用重写,函数将更短(适用于PHP7和更高版本,因为有太空船操作员):

/**
*@param数组$array
*@param字符串$value
*@param bool$asc-asc(真)或DESC(假)排序
*@param bool$keys
*@return数组
* */
函数sortBySubValue($array,$value,$asc=true,$preserveKeys=false)
{
if(是_对象(重置($array))){
$preserveKeys?uasort($array,function($a,$b)use($value,$asc){
返回$a->{$value}==$b->{$value}?0:($a->{$value}$b->{$value})*($asc?1:-1);
}):usort($array,function($a,$b)use($value,$asc){
返回$a->{$value}==$b->{$value}?0:($a->{$value}$b->{$value})*($asc?1:-1);
});
}否则{
$preserveKeys?uasort($array,function($a,$b)use($value,$asc){
返回$a[$value]==$b[$value]?0:($a[$value]$b[$value])*($asc?1:-1);
}):usort($array,function($a,$b)use($value,$asc){
返回$a[$value]==$b[$value]?0:($a[$value]$b[$value])*($asc?1:-1);
});
}
返回$array;
}
使用array\u multisort(),array\u map()


使用
array\u multisort
array\u column
的单线解决方案

//your array
$yourarray = Array
          (
           "0" => Array
                  (
                    "configuration_id" => 10,
                    "id" => 1,
                    "optionNumber" => 3,
                    "optionActive" => 1,
                    "lastUpdated" => "2010-03-17 15:44:12"
                  ),
           "1" => Array
                  (
                    "configuration_id" => 9,
                    "id" => 1,
                    "optionNumber" => 2,
                    "optionActive" => 1,
                    "lastUpdated" => "2010-03-17 15:44:12"
                  ),
           "2" => Array
                  (
                    "configuration_id" => 8,
                    "id" => 1,
                    "optionNumber" => 1,
                    "optionActive" => 1,
                    "lastUpdated" => "2010-03-17 15:44:12"
                  )
);

//access optionNumber in the child arrays using array_column
array_multisort(array_column($yourarray, 'optionNumber'), SORT_ASC, $yourarray);

//print out preformatted
echo "<pre>"; print_r($images); echo "</pre>";
//您的数组
$yourray=Array
(
“0”=>数组
(
“配置id”=>10,
“id”=>1,
“选项编号”=>3,
“optionActive”=>1,
“最近更新”=>“2010-03-17 15:44:12”
),
“1”=>数组
(
“配置id”=>9,
“id”=>1,
“optionNumber”=>2,
“optionActive”=>1,
“最近更新”=>“2010-03-17 15:44:12”
),
“2”=>数组
(
“配置id”=>8,
“id”=>1,
“optionNumber”=>1,
“optionActive”=>1,
“最近更新”=>“2010-03-17 15:44:12”
)
);
//使用array\u列访问子数组中的optionNumber
数组\多排序(数组\列($yourarray,'optionNumber')、排序\ ASC,$yourarray);
//打印出预先格式化的
回声“;打印(图像);回声“;

这对我没什么帮助,因为usort需要我提供一个函数来使用——这是一个困难的地方,我不能很好地理解,他只是给了你一个函数来使用。你必须接受,并不总是有一个内置函数来做你想做的事情,你必须自己编写它。比较函数只需要返回1、0或-1,指示两个元素的排序顺序。我编写了一个简单的比较函数,但是遗漏了“==”。感谢您的帮助,也作为闭包:--usort($array,function($a,$b){return$b[“optionNumber”]-$a[“optionNumber”];})@如果结果是
<0
,它会告诉排序函数
a
应该出现在
b
之前。如果它是
>0
,那么
b
应该出现在
a
@BenSinclair之前,这是因为Kenny的解决方案是针对数字的,这个解决方案是针对字符串的。它们都是正确的:-)+1。对于不区分大小写的排序,请使用strcasecmp而不是strcmp。我们可以为数组中的第二顺序定义键,这意味着我们首先使用optionNumber进行排序,然后使用lastUpdated进行排序。如何做这件事?这是这里最好最有用的答案,应该放在最上面;)@谢谢你,我很感激!顺便说一句,我已经更新了我的答案,并添加了此函数的一个较短版本:)为了使此功能对我起作用,在比较
$a
$b
值时,我必须使用
(大于)而不是
-
(减)。“你说得对,”詹姆斯说。我更改了答案,并添加了使用spaceship operator()。现在它应该可以正常工作了。有没有办法使它不区分大小写?这很简单。非常感谢。我所要做的就是更改我的列名,它就工作了。这还保留了父数组的键。我知道这个问题现在有点老了,但我有一个问题:我看到它确实工作了,但它是如何工作的?我已经在php.net上阅读了array_multisort文档,这对我来说仍然没有多大意义。
usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];} );
/**
 * @param array $array
 * @param string $value
 * @param bool $asc - ASC (true) or DESC (false) sorting
 * @param bool $preserveKeys
 * @return array
 * */
function sortBySubValue($array, $value, $asc = true, $preserveKeys = false)
{
    if ($preserveKeys) {
        $c = [];
        if (is_object(reset($array))) {
            foreach ($array as $k => $v) {
                $b[$k] = strtolower($v->$value);
            }
        } else {
            foreach ($array as $k => $v) {
                $b[$k] = strtolower($v[$value]);
            }
        }
        $asc ? asort($b) : arsort($b);
        foreach ($b as $k => $v) {
            $c[$k] = $array[$k];
        }
        $array = $c;
    } else {
        if (is_object(reset($array))) {
            usort($array, function ($a, $b) use ($value, $asc) {
                return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
            });
        } else {
            usort($array, function ($a, $b) use ($value, $asc) {
                return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
            });
        }
    }

    return $array;
}
sortBySubValue($array, 'optionNumber', true, false);
/**
 * @param array $array
 * @param string $value
 * @param bool $asc - ASC (true) or DESC (false) sorting
 * @param bool $preserveKeys
 * @return array
 * */
function sortBySubValue($array, $value, $asc = true, $preserveKeys = false)
{
    if (is_object(reset($array))) {
        $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {
            return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
        }) : usort($array, function ($a, $b) use ($value, $asc) {
            return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
        });
    } else {
        $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {
            return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
        }) : usort($array, function ($a, $b) use ($value, $asc) {
            return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
        });
    }
    return $array;
}
array_multisort(array_map(function($element) {
      return $element['optionNumber'];
  }, $array), SORT_ASC, $array);

print_r($array);
//your array
$yourarray = Array
          (
           "0" => Array
                  (
                    "configuration_id" => 10,
                    "id" => 1,
                    "optionNumber" => 3,
                    "optionActive" => 1,
                    "lastUpdated" => "2010-03-17 15:44:12"
                  ),
           "1" => Array
                  (
                    "configuration_id" => 9,
                    "id" => 1,
                    "optionNumber" => 2,
                    "optionActive" => 1,
                    "lastUpdated" => "2010-03-17 15:44:12"
                  ),
           "2" => Array
                  (
                    "configuration_id" => 8,
                    "id" => 1,
                    "optionNumber" => 1,
                    "optionActive" => 1,
                    "lastUpdated" => "2010-03-17 15:44:12"
                  )
);

//access optionNumber in the child arrays using array_column
array_multisort(array_column($yourarray, 'optionNumber'), SORT_ASC, $yourarray);

//print out preformatted
echo "<pre>"; print_r($images); echo "</pre>";