Единственная логика, которую я вижу, это то, что они являются ближайшими значениями.
Если это так, вы можете asort () массив для сохранения ключей и сортировки по значению.
Затем используйте array_chunkна 2 с третьим параметром true для сохранения ключей.
$users = array("name one"=>"2","name two"=>"5.5","name three"=>"8","name four"=>"7","name five"=>"2.5","name six"=>"3");
asort($users);
$users = array_chunk($users,2,true);
var_dump($users);
Возвращает:
array(3) {
[0]=>
array(2) {
["name one"]=>
string(1) "2"
["name five"]=>
string(3) "2.5"
}
[1]=>
array(2) {
["name six"]=>
string(1) "3"
["name two"]=>
string(3) "5.5"
}
[2]=>
array(2) {
["name four"]=>
string(1) "7"
["name three"]=>
string(1) "8"
}
}
https://3v4l.org/7SR7C
Сделано!
Первый взгляд на первый и последний элемент, еслиони ближе, чем первое и второе, если они затем добавляются в новый список с помощью array_splice (который удалит их из исходного массива).
Затем просто объедините его с массивом array_chunk.
asort($users);
$keys = array_keys($users);
if(end($users) + $users[$keys[0]] < $users[$keys[1]]-$users[$keys[0]]){
$new[0][$keys[0]] = array_splice($users,0,1);
$new[0][end($keys)] = array_splice($users,-1);
}
$new = array_merge($new, array_chunk($users,2,true));
var_dump($new);
https://3v4l.org/739TZ
array(3) {
[0]=>
array(2) {
["name one"]=>
array(1) {
["name one"]=>
string(3) "-11" // <--- see here
}
["name six"]=>
array(1) {
["name six"]=> // <--- see here
string(2) "12"
}
}
[1]=>
array(2) {
["name two"]=>
string(3) "5.5"
["name four"]=>
string(1) "7"
}
[2]=>
array(2) {
["name three"]=>
string(1) "8"
["name five"]=>
string(1) "9"
}
}