ale*_*lex 136 php arrays sorting
在PHP中可以做这样的事情吗?你会如何写一个函数?这是一个例子.订单是最重要的.
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
Run Code Online (Sandbox Code Playgroud)
我想做点什么
$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));
Run Code Online (Sandbox Code Playgroud)
因为最后我使用foreach()并且它们的顺序不正确(因为我将值附加到需要按正确顺序排列的字符串中,并且我事先并不知道所有数组键/值).
我查看了PHP的内部数组函数,但似乎只能按字母顺序或数字顺序排序.
小智 323
只需使用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')
Run Code Online (Sandbox Code Playgroud)
ps - 我正在回答这个"陈旧"的问题,因为我认为所有作为先前答案给出的循环都是过度的.
Era*_*rin 99
你去:
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;
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*oot 41
这个解决方案怎么样?
$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));
});
Run Code Online (Sandbox Code Playgroud)
eku*_*ser 36
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);
Run Code Online (Sandbox Code Playgroud)
结果:
Array (
[name] => Tim
[dob] => 12/08/1986
[address] => 123 fake st
[dontSortMe] => this value doesnt need to be sorted
)
Run Code Online (Sandbox Code Playgroud)
使用字符串和数字键可以正常工作.
OIS*_*OIS 23
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;
}
Run Code Online (Sandbox Code Playgroud)
hak*_*kre 14
将一个数组作为您的订单:
$order = array('north', 'east', 'south', 'west');
Run Code Online (Sandbox Code Playgroud)
您可以使用array_intersect
Docs基于值对另一个数组进行排序:
/* sort by value: */
$array = array('south', 'west', 'north');
$sorted = array_intersect($order, $array);
print_r($sorted);
Run Code Online (Sandbox Code Playgroud)
或者在您的情况下,要按键排序,请使用array_intersect_key
文档:
/* sort by key: */
$array = array_flip($array);
$sorted = array_intersect_key(array_flip($order), $array);
print_r($sorted);
Run Code Online (Sandbox Code Playgroud)
这两个函数将保持第一个参数的顺序,并且只返回第二个数组中的值(或键).
因此,对于这两种标准情况,您不需要自己编写函数来执行排序/重新排列.
小智 8
我用Darkwaltz4的解决方案,但使用array_fill_keys
的替代array_flip
,以填补NULL
如果钥匙没有设置$array
。
$properOrderedArray = array_replace(array_fill_keys($keys, null), $array);
Run Code Online (Sandbox Code Playgroud)
小智 5
没有魔法...
$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;
}
Run Code Online (Sandbox Code Playgroud)