2013-03-18 71 views
1

我有一個已經排序的數組。Prepend到數組,但保留索引與PHP

現在我想採取所有有一個子數組值爲0的數組,並把它們放在數組的開始。

這就是我試圖做的:

 foreach($dealStatsArray as $deal_id => $dealStats) 
     { 
      if($dealStats['revenueY'] == 0) 
      { 

       $tmpArray[$deal_id] = $dealStats; // Store the array 
       unset($dealStatsArray[$deal_id]); // Unset the current one, since it is not in right position 

       array_unshift($dealStatsArray, $tmpArray); // Prepend the tmp array, to have it at the beginning of the array 
      } 
     } 

現在的問題是,array_unshift()的作用:

「所有的數字鍵名將修改爲從零開始計數」 -php net array_unshift()

這弄亂了我得到的代碼的其餘部分,因爲我需要保留$ dealStatsArray上的索引,並且新的前綴數組的索引應該是$ deal_id而不是0.

我該怎麼做?我需要一個可以管理前面加上2〜3次到數組的開頭,就像它正常工作與array_push溶液(追加)我想這樣做,只是前面加上

更新:這裏是我目前uasort功能,被排序revenueY值後的數組,所以最多是在數組的開始,然後降..

function cmp($a, $b) 
{ 
    if (($a["revenueY"]) == ($b["revenueY"])) { 
     return 0; 
    } 
    return (($a["revenueY"]) > ($b["revenueY"])) ? -1 : 1; 
} 

uasort($dealStatsArray, "cmp"); 

現在,如果我跟着@ thaJeztah的答案,這在一定程度作品,然後我在下面添加了這個:

function sortbyRevenueY($a, $b) { 
    if ($a['revenueY'] == $b['revenueY']) { 
     return 0; 
    } 
    return ($a['revenueY'] == 0) ? -1 : 1; 
} 

uasort($dealStatsArray, 'sortbyRevenueY'); 

但是這並不正確,它確實需要所有的收益== ==數組,並且在數組的開頭預先計算,但是其餘的數組會得到未分類(從最高到最低,第一個uasort())

這是我的最終目標:要有一個數組,其中所有revenueY == 0都位於數組的開始位置,在這之後,最高收入將在數組末尾處下降,然後下降到最低收入。

+0

請給出一個或兩個現有數組的示例,新元素的索引和預期輸出。 – mario 2013-03-18 23:38:46

+0

你如何想象這種工作?如果我有一個看起來像這樣的數組(array)(0 =>'a',1 =>'b')'你會「預先」做什麼?覆蓋值爲0?在-1處插入一些東西? – ITroubs 2013-03-18 23:43:13

+0

@ITURBBS'關聯'數組可以在保持其鍵/值關係的同時進行排序。即有一個數組'array(2 =>'c',1 =>'b',0 =>'a')'應該是可能的 – thaJeztah 2013-03-18 23:59:38

回答

0

你或許可以做到這一點通過「排序」該數組使用自定義回調和uasort();

http://www.php.net/manual/en/function.uasort.php

function sortbyRevenueY($a, $b) { 
    if ($a['revenueY'] == $b['revenueY']) { 
     return 0; 
    } 

    if (0 == $a['revenueY']) { 
     return -1; 
    } 

    if (0 == $b['revenueY']) { 
     return 1; 
    } 

    return (($a["revenueY"]) > ($b["revenueY"])) ? -1 : 1; 
} 

uasort($dealStatsArray, 'sortbyRevenueY'); 

print_r($dealStatsArray); 

一直無法對其進行測試和「回調」的方法可能需要一些調整,但是,uasort()允許您使用,決定自定義的「回調」的方法排序數組「如何'數組應該排序。數組內的值將被排序,沒有丟失鍵/值關係。

我的例子只是爲了說明如何實現這一點,但如上所述,可能需要進行調整。

[更新] 我已經通過示例進行了更新,嘗試將'常規'排序和'0'排序合併爲一個回調。再次未經測試,但也許這項工作。請測試這個更新的例子。

+0

謝謝你的回答。這個課程的作用,但問題是,我已經提到了一個已經排序過的數組(它已經用uasort和自定義回調進行了排序),當我做這個第二個uasort()時,它的前綴數組爲revenueY == 0,但其餘的都沒有排序? – Karem 2013-03-19 08:39:16

+0

我的第一個排序是對整個數組進行排序,以便最高的收入Y在頂部然後下降。但除此之外,我希望所有的收入都是0,並且是最高的。我不知道是否可以使用一個可以處理和排序的回調函數創建一個單一的uasort? – Karem 2013-03-19 08:40:41

+0

檢查我更新的問題@thaJeztah – Karem 2013-03-19 08:46:08

-1

你可以嘗試合併數組,而不是unshifting:

$dealStatsArray = array_merge($tmpArray, $dealStatsArray); 

所以不管有多少項$tmpArray都會有,他們將在年初

+0

,真的弄亂了鑰匙!看看文檔,特別是在這個例子中!如果鍵是數字,那麼它們將被移位。 – ITroubs 2013-03-19 00:03:17