【问题标题】:PHP Sorting an array based on list of valuesPHP根据值列表对数组进行排序
【发布时间】:2020-04-12 16:22:26
【问题描述】:

我正在寻找一种对数组进行排序的方法。

这里是简化的例子;

$myArray = [ 
  ['ref' => 103, 'refList' => '101,102,111'],
  ['ref' => 104, 'refList' => '101,103'],
  ['ref' => 105, 'refList' => '106,103'],
  ['ref' => 106, 'refList' => '103,104,110'],
];

数组项的排序规则是;

“refList”中包含引用的项目必须位于任何具有匹配“ref”的项目之后

所以在这种情况下,正确的顺序是;

  ['ref' => 103, 'refList' => '101,102,111'],
  ['ref' => 104, 'refList' => '101,103'],
  ['ref' => 106, 'refList' => '103,104'],
  ['ref' => 105, 'refList' => '106,103,110'],

我尝试了一些非常冗长的方法以及 usort(),但无法做到这一点。我沿着以下路线走;

usort($myArray, 'refSorter');

function refSorter($a, $b) {

    $arrayOfRefs = explode(',', $b['refList']);

    if (in_array($a['ref'], $arrayOfRefs)) {
        return 1;
    }
    return 0;
}

【问题讨论】:

  • 你快接近了。您需要检查关系并根据两者中发现的参考差异返回结果

标签: php arrays sorting


【解决方案1】:

排序规则有点模棱两可,但是这个怎么样(修改以匹配确切的条件):

function refSorter($a, $b) {

    $arrayOfRefsa = explode(',', $a['refList']);
    $arrayOfRefsb = explode(',', $b['refList']);

    $refCmp =  $a['ref'] === $b['ref'] ? 0 : ($a['ref'] < $b['ref'] ? -1 : 1);
    $refListCmp = in_array($b['ref'], $arrayOfRefsa) ? 1 : (in_array($a['ref'], $arrayOfRefsb) ? -1 : 0);
    return $refListCmp*10+$refCmp;
}

给出正确的输出,例如给定的列表(已测试)

【讨论】:

    【解决方案2】:

    您的比较算法中缺少一个案例。当 A ref 包含在 B refList 中时,您应该返回 -1;当 B ref 包含在 A refList 中时,您应该返回 1

    $myArray = [ 
      ['ref' => 103, 'refList' => '101,102,111'],
      ['ref' => 104, 'refList' => '101,103'],
      ['ref' => 105, 'refList' => '106,103'],
      ['ref' => 106, 'refList' => '103,104,110'],
    ];
    
    usort($myArray, 'refSorter');
    
    function refSorter($a, $b) {
        $aRefs = explode(',', $a['refList']);
        $bRefs = explode(',', $b['refList']);
    
        if (in_array($a['ref'], $bRefs)) {
            return -1;
        }
    
        if (in_array($b['ref'], $aRefs)) {
            return 1;
        }
    
        return $a['ref'] <=> $b['ref'];
    }
    

    结果:

    ref => 103 | refList => 101,102,111
    ref => 104 | refList => 101,103
    ref => 106 | refList => 103,104,110
    ref => 105 | refList => 106,103
    

    PHPSandbox

    【讨论】:

    • 您也缺少与 ref 的比较(如果没有 reflist 相互匹配)
    猜你喜欢
    • 2013-12-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多