Соедините пользователей с наименьшими значениями разницы с помощью PHP / Javascript - PullRequest
0 голосов
/ 31 января 2019

У меня есть массив с именем и некоторым значением, подобным этому:

$users = array(
    "name one"=>"2",
    "name two"=>"5.5",
    "name three"=>"8",
    "name four"=>"7",
    "name five"=>"2.5", 
    "name six"=>"3"
 );

Теперь я хочу сделать из него 3 пары, но значение обеих пар должно быть ближайшим, как пример ответа:

name three pair with name four
name one pair with name five
name two pair with name six

Я не могу найти ни одной функции в php или javascript для создания пар, подобных этой, или любой другой полезной для нее функции.

Пожалуйста, дайте мне знать, есть ли какая-либо функция, доступная для той же или подобной вещи.или любые пользовательские коды для достижения этого

1 Ответ

0 голосов
/ 31 января 2019

Единственная логика, которую я вижу, это то, что они являются ближайшими значениями.
Если это так, вы можете 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"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...