在有人说'尝试谷歌'之前,我已经完成了加上搜索到的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提供的任何建议都无法得到我需要的结果。
很抱歉,如果所有这些都是冗长的解释,但我认为最好具体一点。所以,如果有人对如何做到这一点有任何想法,我将非常感激。
提前谢谢你,
迈克尔
答案 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会牺牲可读性。