将差异最小的用户与PHP / Javascript配对

时间:2019-01-31 10:17:46

标签: 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"
 );

现在我想从中制作3对,但两个对的值都必须最接近,例如示例答案:

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

我在php或javascript中找不到用于配对或类似功能的函数。

请让我知道是否有任何功能可用于相同或相似的事物或任何自定义代码来实现

1 个答案:

答案 0 :(得分:5)

我能看到的唯一逻辑是它们是最接近的值。
如果是这种情况,则可以对数组进行sort()来保留键并按值排序。
然后在第三个参数为true的2上使用array_chunk保留键。

$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://docs.particular.net/nservicebus/messaging/headers#retries-handling-headers-nservicebus-retries


做到了!

首先查看第一项和最后一项是否比第一项和第二项更近,然后使用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/7SR7C

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"
  }
}