2011-10-05 84 views
2

有沒有一種乾淨的方式來安排這個數組,使密鑰變成ID?我用幾個foreach和一個新的數組完成了幾次這樣的信息,但我使用了大約7行代碼,並且想知道是否有更乾淨的東西。有問題的數組是:重新排列一個數組

Array ( 
    [0] => Array ([log_id] => 6 [type] => Test [other_info] => MoreInfo) 
    [1] => Array ([log_id] => 5 [type] => Test2 [other_info] => MoreInfo2) 
) 

所以我想從上面的陣列獲得的是:

Array ( 
    [6] => Array ([type] => Test [other_info] => MoreInfo) 
    [5] => Array ([type] => Test2 [other_info] => MoreInfo2) 
) 

你可以看到,我把現在登錄ID爲關鍵。這需要我多行代碼......您是否知道最多可以在3行或4行中實現?

另外,是否有更簡潔的方式來訪問包含我想要的* log_id *的行?我想給這個的用途是我可以訪問某個* log_id *的行...在這種情況下,我會用$array[$log_id] ...但是如果有一個解決方案來做到這一點而不改變數組(並且只有一行)我也會接受這個答案呢!

謝謝!

+0

是否有任何原因,你最初不能用log_id構造數組而不必轉換它? –

+0

它來自SELECT * FROM查詢...我不認爲我可以,據我所知。 – luqita

回答

1

但爲什麼你需要多個foreach語句?這是不是回答你的問題:

$new_arr = array(); 
foreach ($old_arr as $row) { 
    $new_arr[$row['log_id']][] = $row; 
} 

唯一的區別是,新的行仍會有LOG_ID關鍵,但我懷疑這是怎麼回事打擾你。除此之外,我發現它非常清楚。

+0

是的..這是我如何做到這一點......但其中一些有多個fors,如果我有一個結果,其中log_id例如重複,我需要在密鑰log_id內另一個數組來保存所有的數據那個log_id。 – luqita

+0

啊,我明白你爲什麼最初有這個問題。但是有一個簡單的解決方法,我已經更新了我的示例以包含它:我添加了'[]',以便$ new_arr [log_id]將始終是一個數組(有時它可能只有一個元素/行,但在我看來這沒關係 - 你實際上可以將它們統一處理)。請讓我知道這對你有沒有用。 – deviousdodo

+0

順便說一下,使用array_map等的解決方案在這個用例(如果可能的話)中看起來會非常難看。 – deviousdodo

3

你不應該關心代碼行,優雅的代碼是自我記錄,這意味着你可以閱讀它,並理解它的作用。它包含了它所需要的最少的行數,這通常需要更長的時間進行編碼。

與此相反,以優雅的代碼被壓縮,神祕的代碼,這樣其中一個確實您所需要的有問題的陣列(我把它改成$dataDemo):

$data = array_reduce($data, function($v, $w) { $v[array_shift($w)] = $w; return $v;}); 

這只是一個代碼行,但它並不優雅。

這可以讀更好:

/** 
* You can leave a comment here. 
* @return array $data keyed with first value of each value 
*/ 
function first_as_key(Array $data) 
{ 
    $keyed = array(); 
    foreach($data as $v) 
     $keyed[array_shift($v)] = $v 
     ; 
    return $keyed; 
} 

它經常要好得多,在不需要進行轉它的形式手頭上的數據。此外,如果您需要轉置,請爲您創建一個可爲您完成工作的功能。

+0

@Downvoter:小心分享? – hakre

1

我不知道有一個好的方法來做到這一點,而不是創建一個新的數組(因爲如果你只是在現有的數組上操作,你可能會發生關鍵衝突(在你的例子中,如果第一個項目有1一LOG_ID?)

有可能將此放入使用PHP的create_function功能單一的線,但它是相當糟糕的可讀性。不管你用6個或7行可能是做到這一點的最好辦法。

但是出於參數的緣故,這裏有一種方法可以使用array_walk在兩行中完成:

<?php 
$test = array(); 
$test[] = array('id' => 6, 'data' => 'asdf'); 
$test[] = array('id' => 7, 'data' => 'qwer'); 

print_r($test); 

$result = array(); 
array_walk($test, create_function('&$val,$key', 'global $result; $result[$val[\'id\']] = $val;')); 
print_r($result); 
?> 

出於好奇,你是如何創建數組?如果它來自任何類型的數據庫,那麼添加條目時最好創建密鑰。