在PHP中可以做这样的事情吗?你会如何写一个函数?这是一个例子.订单是最重要的.
$customer['address'] = '123 fake st'; $customer['name'] = 'Tim'; $customer['dob'] = '12/08/1986'; $customer['dontSortMe'] = 'this value doesnt need to be sorted';
我想做点什么
$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));
因为最后我使用foreach()并且它们的顺序不正确(因为我将值附加到需要按正确顺序排列的字符串中,并且我事先并不知道所有数组键/值).
我查看了PHP的内部数组函数,但似乎只能按字母顺序或数字顺序排序.
只需使用array_merge
或array_replace
.Array_merge
通过从你给它的数组(以正确的顺序)开始并覆盖/添加来自实际数组的数据的键来工作:
$customer['address'] = '123 fake st'; $customer['name'] = 'Tim'; $customer['dob'] = '12/08/1986'; $customer['dontSortMe'] = 'this value doesnt need to be sorted'; $properOrderedArray = array_merge(array_flip(array('name', 'dob', 'address')), $customer); //Or: $properOrderedArray = array_replace(array_flip(array('name', 'dob', 'address')), $customer); //$properOrderedArray -> array('name' => 'Tim', 'address' => '123 fake st', 'dob' => '12/08/1986', 'dontSortMe' => 'this value doesnt need to be sorted')
ps - 我正在回答这个"陈旧"的问题,因为我认为所有作为先前答案给出的循环都是过度的.
你去:
function sortArrayByArray(array $array, array $orderArray) { $ordered = array(); foreach ($orderArray as $key) { if (array_key_exists($key, $array)) { $ordered[$key] = $array[$key]; unset($array[$key]); } } return $ordered + $array; }
这个解决方案怎么样?
$order = array(1,5,2,4,3,6); $array = array( 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five', 6 => 'six' ); uksort($array, function($key1, $key2) use ($order) { return (array_search($key1, $order) > array_search($key2, $order)); });
PHP的另一种方式> = 5.3.0:
$customer['address'] = '123 fake st'; $customer['name'] = 'Tim'; $customer['dob'] = '12/08/1986'; $customer['dontSortMe'] = 'this value doesnt need to be sorted'; $customerSorted = array_replace(array_flip(array('name', 'dob', 'address')), $customer);
结果:
Array ( [name] => Tim [dob] => 12/08/1986 [address] => 123 fake st [dontSortMe] => this value doesnt need to be sorted )
使用字符串和数字键可以正常工作.
function sortArrayByArray(array $toSort, array $sortByValuesAsKeys) { $commonKeysInOrder = array_intersect_key(array_flip($sortByValuesAsKeys), $toSort); $commonKeysWithValue = array_intersect_key($toSort, $commonKeysInOrder); $sorted = array_merge($commonKeysInOrder, $commonKeysWithValue); return $sorted; }
将一个数组作为您的订单:
$order = array('north', 'east', 'south', 'west');
您可以使用array_intersect
Docs基于值对另一个数组进行排序:
/* sort by value: */ $array = array('south', 'west', 'north'); $sorted = array_intersect($order, $array); print_r($sorted);
或者在您的情况下,要按键排序,请使用array_intersect_key
文档:
/* sort by key: */ $array = array_flip($array); $sorted = array_intersect_key(array_flip($order), $array); print_r($sorted);
这两个函数将保持第一个参数的顺序,并且只返回第二个数组中的值(或键).
因此,对于这两种标准情况,您不需要自己编写函数来执行排序/重新排列.
我用Darkwaltz4的解决方案,但使用array_fill_keys
的替代array_flip
,以填补NULL
如果钥匙没有设置$array
。
$properOrderedArray = array_replace(array_fill_keys($keys, null), $array);
没有魔法...
$array=array(28=>c,4=>b,5=>a); $seq=array(5,4,28); SortByKeyList($array,$seq) result: array(5=>a,4=>b,28=>c); function sortByKeyList($array,$seq){ $ret=array(); if(empty($array) || empty($seq)) return false; foreach($seq as $key){$ret[$key]=$dataset[$key];} return $ret; }