使用PHP/Javascript将具有最小差值的用户配对

Moh*_*umb 2 javascript php logic

我有一个名字和数字的数组,如下所示:

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

现在我想从它做3对,但两个对值必须最接近,例如答案将:

name three pair with name four
name one pair with name five
name two pair with name six
Run Code Online (Sandbox Code Playgroud)

我在php或javascript中找不到任何函数来制作像这样的对或任何相关的有用函数.

如果有相同或类似的功能或任何自定义代码可以实现它,请告诉我

And*_*eas 6

我能看到的唯一逻辑是它们是最接近的值.
如果是这种情况,那么您可以asort()数组以保留键并对值进行排序.
然后在2上使用array_chunk,第三个参数为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);
Run Code Online (Sandbox Code Playgroud)

返回:

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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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"
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是完美的.(是的,给我留下深刻印象并不需要太多:P) (2认同)