php_二維數組排序

來源:互聯網
上載者:User
請講解一下這段排序的原理,特別是引用賦值那裡是怎麼回事,謝謝。
//按照name的長度排序,id從1開始;

 0, 'name' => '12'),    array('id' => 0, 'name' => 'ada'),    array('id' => 0, 'name' => 'asdfsdf'),    array('id' => 0, 'name' => '10sdf'),    array('id' => 0, 'name' => 'aasdfbc'));foreach($arr as $key=>$value) {    $long[$key] = strlen($value['name']);}    array_multisort($long,SORT_ASC,$arr);    $i = 1;    foreach($arr as &$value){           $value['id']=$i;        $i++;        $arr[]+$value;    }

回複內容:

請講解一下這段排序的原理,特別是引用賦值那裡是怎麼回事,謝謝。
//按照name的長度排序,id從1開始;

 0, 'name' => '12'),    array('id' => 0, 'name' => 'ada'),    array('id' => 0, 'name' => 'asdfsdf'),    array('id' => 0, 'name' => '10sdf'),    array('id' => 0, 'name' => 'aasdfbc'));foreach($arr as $key=>$value) {    $long[$key] = strlen($value['name']);}    array_multisort($long,SORT_ASC,$arr);    $i = 1;    foreach($arr as &$value){           $value['id']=$i;        $i++;        $arr[]+$value;    }

謝邀(雖然你沒要請我(┬_┬))。
首先你要搞懂什麼是 array_multisort()
PHP array_multisort

當然,你看看就得了,看不明白是正常的。

那麼 我用簡潔的語言講一下 什麼是array_multisort()

    array_multisort(array1,sorting order,sorting type,array2,array3...)

我們清楚的看到 上面有array1 array2 array3.....(sorting order,sorting type先不說)
array1,我們把它看作是編號
array2,array3....我們把他看作數組。
當我們使用array_multisort的時候,實際上array1,array2,array3... 中的所有元素就一一對應了
強調一遍,是一一對應!!!(所以,不允許出現數組元素不一樣的情況)
然後,排列array1,後面的array2 array3...就跟隨著array1進行排列。array1就是他們的id。

     0, 'name' => '12'),    array('id' => 0, 'name' => 'ada'),    array('id' => 0, 'name' => 'asdfsdf'),    array('id' => 0, 'name' => '10sdf'),    array('id' => 0, 'name' => 'aasdfbc'));//這個是array1 換句話說,他就是數組的id,其他數組的排列是隨著他的foreach($arr as $key=>$value) {    $long[$key] = strlen($value['name']);}//排序開始array_multisort($long,SORT_ASC,$arr);    $i = 1;//剩下就是foreach了    foreach($arr as &$value){           $value['id']=$i;        $i++;        $arr[] = $value;    }

不知道我說清楚了沒有?

foreach官方文檔

可以很容易地通過在 $value 之前加上 & 來修改數組的元素。此方法將以引用賦值而不是拷貝一個值。

不加&的 foreach 可以理解為拷貝一份數組 $arr_tmp ,然後遍曆 $arr_tmp ,遍曆中的 $value 是臨時數組 $arr_tmp 的元素,而不是 $arr 的元素。

加上&的遍曆則不同了,可以認為這時遍曆的臨時數組$arr_tmp的每個元素,都是$arr中元素的引用,這時在 foreach 中修改 $value ,是通過引用修改了 $arr 中的元素數值。

array_multisort很少用了吧,多維陣列排序一般習慣用 usort ,你這修改key的需求也是有點奇葩
那個foreach裡參數使用引用也不建議使用,因為foreach完畢後$value是不銷毀的 ,需要unset掉,文檔中也有強調。

http://3v4l.org/hBnIE

 0, 'name' => '10sdf'],    ['id' => 0, 'name' => '12'],    ['id' => 0, 'name' => 'aasdfbc'],    ['id' => 0, 'name' => 'ada'],    ['id' => 0, 'name' => 'asdfsdf'],];//排序usort($arr, function ($a, $b) {    if (strlen($a['name']) == strlen($b['name'])) return 0;    return strlen($a['name']) < strlen($b['name']) ? -1 : 1;});//修改key$arr1 = [];array_walk($arr, function ($v,$k) use (&$arr1){    $arr1[$k+1] = $v;});var_dump($arr1);

/**

  • 二維數組根據欄位進行排序

  • @params array $array 需要排序的數組

  • @params string $field 排序的欄位

  • @params string $sort 排序次序標誌 SORT_DESC 降序;SORT_ASC 升序
    */

function arraySequence($array, $field, $sort = 'SORT_DESC')
{

$arrSort = array();foreach ($array as $uniqid => $row) {    foreach ($row as $key => $value) {        $arrSort[$key][$uniqid] = $value;    }}array_multisort($arrSort[$field], constant($sort), $array);return $array;

}

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.