【问题标题】:Sorting an array with certain known values prioritized, php对具有某些已知值优先级的数组进行排序,php
【发布时间】:2020-08-19 07:14:09
【问题描述】:

我想根据子数组的值对数组进行排序,这部分很简单,但是还有一个额外的要求。

我也有一组已知的值,在这种情况下,我想按这些值排序

在这种情况下,我排序的值是 IP 地址。

例如,如果地址是 1.1.1.5,我希望该地址成为列表中的第一个值,如果它是 1.1.7.3,我希望它成为列表中的第二个值,依此类推。

然后,一旦我用完了已知地址,我希望其余的简单地正常排序。

数组的起始顺序是完全随机的 如果可能的话,我还想在已知 IP 的前面添加一些内容

我如何在没有优先级的情况下对其进行排序:

uasort($array, function func($a, $b) {
    return strcmp($a[4], $b[4]);
});

【问题讨论】:

  • 你应该添加你迄今为止尝试做的事情
  • 只需向我们展示您编写的代码,我们将为您提供帮助。你甚至没有提到我们从哪里得到这些值。
  • 如何在 PHP 中对数组和数据进行排序? -> stackoverflow.com/questions/17364127/…
  • @waanofii.tech 我添加了一些代码,但我没有任何代码的原因是因为我看不到它有多大帮助。我现在只有一个基本的排序。我不知道如何将手动排序排序与标准字符串比较排序混合使用
  • 您是新成员,所以我假设您不熟悉如何询问堆栈溢出问题。[阅读]stackoverflow.com/help/how-to-ask 继续前进,您希望我们对什么数组进行排序,您甚至没有发布了数组结构,更不用说示例数据了,您希望如何在没有实际提供要排除的数据和要排序的数据的情况下获得对某些数据进行排序的帮助。你看不到它有什么帮助这一事实比你的问题更痛苦。 @JacobPetersen

标签: php arrays sorting


【解决方案1】:

我认为您不能更改排序中的 IP 值,以便之后需要完成。对于 sort 函数,这样的事情怎么样(你需要测试性能):

$knownIPs = array(
    '1.1.1.5' => 1,
    '1.1.7.3' => 2,
);

$array = array(
    array('f', '0.0.0.0'),
    array('t', '1.1.7.3'),
    array('w', '1.1.1.5'),
    array('r', '1.1.1.6'),
    array('c', '1.1.1.7'),
    array('a', '1.1.1.8'),
    array('i', '1.1.1.9'),
);

uasort($array, function ($a, $b) {
  global $knownIPs;

  $knownIPsKeys = array_keys($knownIPs);
  //if a is a known IP then it has to be before any unknown IP
  if(in_array($a[1],$knownIPsKeys) && !in_array($b[1],$knownIPsKeys)){
    return -1;
  }
  //if b is a known IP then it has to be before any unknown IP
  if(in_array($b[1],$knownIPsKeys) && !in_array($a[1],$knownIPsKeys)){
    return 1;
  }
  //if a and b are both known then check if their order is the same or different
  if(in_array($a[1],$knownIPsKeys) && in_array($b[1],$knownIPsKeys)){
    //if a and b have the same order then compare on the other field as per default
    if($knownIPs[$a[1]]===$knownIPs[$b[1]]){
      return strcmp($a[0], $b[0]);
    }
    //otherwise compare on the order value
    return $knownIPs[$a[1]]<$knownIPs[$b[1]]?-1:1;
  }
  //compare on other field as default
  return strcmp($a[0], $b[0]);
});

print_r($array);

这是一个使用全局变量来保存已知 IP 的简单脚本,可以通过多种不同的方式设置和使用 $knownIPs,这显然取决于您的代码的其余部分,但希望这可以让您了解如何实现排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    相关资源
    最近更新 更多