对复杂的多维数组进行排序会在底部放置空白值

时间:2014-03-12 12:09:59

标签: php arrays sorting

在有人说'尝试谷歌'之前,我已经完成了加上搜索到的php.net的解决方案:)

所以这是我的问题。我有一个相当复杂的多维数组,它是由一个类中的方法生成的,该类在将数据传递给现有数据表时执行基于levenshtein的匹配算法。以下是数组外观的示例:

[6976989] => Array
    (
        [recid] => 4
        [appid] => 
        [loanid] => 6976989
        [import_name] => Joe Bloggs
        [import_postcode] => BL0 G55
        [import_email] => blahh@blahhh.co.uk
    )

[32424] => Array
    (
        [recid] => 5
        [appid] => 345
        [loanid] => 32424
        [import_name] => Henry Hill
        [import_postcode] => BS5 1GH
        [import_email] => thisis@myemail.com
        [matches] => Array
            (
                [5] => Array
                    (
                        [appid] => 345
                        [match_name] => Henry Hall
                        [match_postcode] => BS5 1GH
                        [match_email] => thisis@myemail.com
                    )

            )

    )

该阵列基本上会找到来自第三方公司传入的数据的紧密匹配,然后在CRM界面上使用此结果,以便客户批准或拒绝所提供的匹配。

这就是它的工作方式 - 而且效果很好。但是,问题是传递给表的一些数据与现有的任何数据完全不同(在上面的Joe Bloggs的情况下),因此没有匹配数组可以为用户提供。我们可以这样说的是[appid]是空白的(这是与第一个返回的匹配匹配的id)。如果appid为空或NULL,那么我需要它出现在界面的底部。我已经尝试在appid值上做一个usort(),但我对这种方式的数组排序不是很有经验,无论我做什么,我使用的php.net提供的任何建议都无法得到我需要的结果。

很抱歉,如果所有这些都是冗长的解释,但我认为最好具体一点。所以,如果有人对如何做到这一点有任何想法,我将非常感激。

提前谢谢你,

迈克尔

1 个答案:

答案 0 :(得分:1)

这是使用自定义比较函数对数组进行排序的标准情况,该函数已经被覆盖了太多次。

在这种情况下,唯一明显的特征是你想要空值和空格(空字符串?)来比较任何数值。所以只需将其编入比较函数:

function compareButEmptyIsLarger($x, $y)
{
    $isXEmpty = !strlen($x);
    $isYEmpty = !strlen($y);

    // Warning: this code tries to be clever at the expense of readability
    return $isXEmpty || $isYEmpty ? $isXEmpty - $isYEmpty : $x - $y;

    // If unsure how it works exactly it will be better to use longhand:
    // if ($isXEmpty && $isYEmpty) return 0; // two blanks are equal
    // else if ($isXEmpty) return 1;         // x is blank so "greater"
    // else if ($isYEmpty) return -1;        // y is blank so x is "lesser"
    // else return $x - $y;                  // numeric comparison
}

然后,您可以将此功能与任何可自定义的比较方法集成。使用my answer to a related question中的代码,您可以执行以下操作:

usort($data, make_comparer(['appid', SORT_ASC, 'compareButEmptyIsLarger']));

或者,对于标准材料版本:

usort($data, 
      function($x, $y) { 
          returnCompareButEmptyIsLarger($x['appid'], $y['appid']);
      });

当然,您可以将returnCompareButEmptyIsLarger的逻辑内联到比较lambda中以获得更好的性能,IMO会牺牲可读性。