2014-03-12 64 views
-1

人前說「嘗試谷歌」,我已經做到了加搜索php.net一個解決方案:)排序複雜的多維數組把空值在底部

因此,這裏是我的問題。我有一個相當複雜的多維數組,它是由一個類中的一個方法生成的,該類通過將數據傳遞到現有數據表來實現基於levenshtein的匹配算法。這裏是數組會怎樣看一個例子:

[6976989] => Array 
    (
     [recid] => 4 
     [appid] => 
     [loanid] => 6976989 
     [import_name] => Joe Bloggs 
     [import_postcode] => BL0 G55 
     [import_email] => [email protected] 
    ) 

[32424] => Array 
    (
     [recid] => 5 
     [appid] => 345 
     [loanid] => 32424 
     [import_name] => Henry Hill 
     [import_postcode] => BS5 1GH 
     [import_email] => [email protected] 
     [matches] => Array 
      (
       [5] => Array 
        (
         [appid] => 345 
         [match_name] => Henry Hall 
         [match_postcode] => BS5 1GH 
         [match_email] => [email protected] 
        ) 

      ) 

    ) 

的陣列將基本找到來自第三方公司通過在數據接近的比賽,然後使用這個結果的CRM接口上的客戶端批准或拒絕提交的比賽。

這就是它的工作原理 - 它運作良好。然而,問題是傳遞給表的一些數據與現有的任何數據完全不同(在上面的Joe Bloggs中),因此沒有匹配數組提供給用戶。我們可以告訴的是,[appid]是空白的(這是匹配第一個返回匹配的id)。如果appid爲空或NULL,那麼我需要它顯示在界面的底部。我試過在appid值上做一個usort(),但是我對這種方式的數組排序並不是很熟練,無論我做什麼,以及php.net提供的任何建議,我都無法得到我需要的結果。

對不起,如果這是一個長長的解釋,但我認爲最好是具體的。所以如果任何人有任何想法如何做到這一點,我會非常感激。

謝謝你在前進,

邁克爾

+0

索引是否必須保持關聯? – superphonic

回答

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邏輯到比較拉姆達更好性能,IMO犧牲可讀性。

+0

謝謝,這個作品完美。我意識到比較函數已經被覆蓋了,實際上我已經看到了php.net上的例子 - 但我想我無法正確地將它應用到我自己的代碼中!再次感謝。 –