0

我得到两个数组

$check = getmxrr ( $domain, $mxhosts, $weight );

我想将第三个数组中的 mxhosts 从最低到最高权重。

为简单起见,让我们使用简单的数组名称和值:

$s = array('slowest','fast','very slow', 'slow','very fast', 'fastest');
$n = array( 40,       10,    30,          20,    5,           0       );

现在,使用这段代码,我可以得到我正在寻找的有序数组:

$o = array_combine($n, $s);
ksort($o);

但是,如果存在具有相同权重的元素,则只有具有重复权重的最后一个元素会出现在有序数组中。

有没有没有这个问题的类似(低占用空间)解决方案?

示例性案例如下。

权重值是唯一的。输出正常

[0] => fastest
[5] => very fast
[10] => fast
[20] => slow
[30] => very slow
[40] => slowest

我们有相同重量的元素。输出不正常(快没了)

$n = array( 40,       10,    30,         10,       20,    5,           0       );
$s = array('slowest','fast','very slow','fast2', 'slow','very fast', 'fastest');
[0] => fastest
[5] => very fast
[10] => fast2
[20] => slow
[30] => very slow
[40] => slowest
4

3 回答 3

2

由于您认为主机名是唯一的,因此请切换组合的顺序

$n = array( 40,       10,    30,         10,       20,    5,           0       );
$s = array('slowest','fast','very slow','fast2', 'slow','very fast', 'fastest');
$o = array_combine($s, $n);

并在维护键的同时使用 asort 对值进行排序

asort($o);

比您排序的主机名在 array_keys 中

var_dump(array_keys($o));
array(7) {
  [0]=>
  string(7) "fastest"
  [1]=>
  string(9) "very fast"
  [2]=>
  string(5) "fast2"
  [3]=>
  string(4) "fast"
  [4]=>
  string(4) "slow"
  [5]=>
  string(9) "very slow"
  [6]=>
  string(7) "slowest"
}

var_dump($o);
array(7) {
  ["fastest"]=>
  int(0)
  ["very fast"]=>
  int(5)
  ["fast2"]=>
  int(10)
  ["fast"]=>
  int(10)
  ["slow"]=>
  int(20)
  ["very slow"]=>
  int(30)
  ["slowest"]=>
  int(40)
}
于 2012-05-31T12:10:39.660 回答
1

你可以这样做:

$s = array('slowest','fast', 'slow', 'fastest', 'slow 2');
$n = array( 40, 10, 20, 0, 20);

$res = array();
foreach ($n as $k => $v) {
    $res[$v] .= count($res[$v]) ? ",{$s[$k]}" : $s[$k];
}

ksort($res);
$res = explode(',', implode(',', $res));

print_r($res);
/*
Array
(
    [0] => fastest
    [1] => fast
    [2] => slow
    [3] => slow 2
    [4] => slowest
)
*/
于 2012-05-31T11:52:25.097 回答
0

试试这个

function cmp($a, $b)
{
    if ($a > $b)
        return 1;
    elseif ($b > $a)
        return -1;
    else
       return 0;
}

uksort($array, 'cmp');
于 2012-05-31T11:59:13.440 回答