Php usort用例的意外结果 让我们考虑下面的代码: $arr = [ [ 'expiryDate' => '2018.6' ], [ 'expiryDate' => '2018.5' ], [ 'expiryDate' => '2018.7' ] ]; $sortby = "expiryDate"; usort($arr, function($a1, $a2) use ($sortby) { $d1 = DateTime::createFromFormat("Y.m", $a1[$sortby])->getTimestamp(); $d2 = DateTime::createFromFormat("Y.m", $a2[$sortby])->getTimestamp(); return $d1 - $d2; }); echo "<pre>"; var_dump($arr);

Php usort用例的意外结果 让我们考虑下面的代码: $arr = [ [ 'expiryDate' => '2018.6' ], [ 'expiryDate' => '2018.5' ], [ 'expiryDate' => '2018.7' ] ]; $sortby = "expiryDate"; usort($arr, function($a1, $a2) use ($sortby) { $d1 = DateTime::createFromFormat("Y.m", $a1[$sortby])->getTimestamp(); $d2 = DateTime::createFromFormat("Y.m", $a2[$sortby])->getTimestamp(); return $d1 - $d2; }); echo "<pre>"; var_dump($arr);,php,Php,这两种代码具有相同的比较器,但输出不同。基本上,第二个代码未能按要求排序。第二段有什么问题?我在这里遗漏了什么?排序正在工作,但您的函数从未将结果传回,因此要么返回数组,要么将函数声明更改为 &表示它使用相同的数组而不是副本。按引用传递函数sortItOutYourself(&$arr,$sortby,$isDate){Btw,在PHP中,数组总是按值传递。但是,如果数组包含对象,则每个对象都按引用传递,数组按值传递。下面是一个解释: $arr = [ [ 'expiryDate' =>

这两种代码具有相同的比较器,但输出不同。基本上,第二个代码未能按要求排序。第二段有什么问题?我在这里遗漏了什么?

排序正在工作,但您的函数从未将结果传回,因此要么返回数组,要么将函数声明更改为


&
表示它使用相同的数组而不是副本。

按引用传递<代码>函数sortItOutYourself(&$arr,$sortby,$isDate){Btw,在PHP中,数组总是按值传递。但是,如果数组包含对象,则每个对象都按引用传递,数组按值传递。下面是一个解释:
$arr = [ [ 'expiryDate' => '2018.6' ], [ 'expiryDate' => '2018.5' ], [ 'expiryDate' => '2018.7' ] ];

function sortItOutYourself($arr, $sortby, $isDate) {    
    if( $isDate ) {
        usort($arr, function($a1, $a2) use ($sortby) {
            $d1 = DateTime::createFromFormat("Y.m", $a1[$sortby])->getTimestamp();
            $d2 = DateTime::createFromFormat("Y.m", $a2[$sortby])->getTimestamp();
            return $d1 - $d2;
        });
    }
}

sortItOutYourself($arr, "expiryDate", true);
echo "<pre>";
var_dump($arr);
function sortItOutYourself(&$arr, $sortby, $isDate) {