請講解一下這段排序的原理,特別是引用賦值那裡是怎麼回事,謝謝。
//按照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;
}