2011-06-26 54 views
1

構建陣列時出現奇怪的問題。我開始了與一個數組,看起來像這樣:以不同編碼風格構建陣列的問題

Array (
     [0] => Array (
         [tag_id] => 19 
         [tag_translation_id] => 12 
         [fk_language_id] => 1 
         [fk_tag_id] => 19 
         [tag_name] => test 
        ) 
     [1] => Array (
         [tag_id] => 20 
         [tag_translation_id] => 14 
         [fk_language_id] => 1 
         [fk_tag_id] => 20 
         [tag_name] => testa 
        ) 
     [2] => Array (
         [tag_id] => 20 
         [tag_translation_id] => 15 
         [fk_language_id] => 3 
         [fk_tag_id] => 20 
         [tag_name] => fdfda 
        ) 
     ) 

我想要做的就是每個結果與同TAG_ID一個陣列合併。這工作:

$tags = array(); 
    foreach($results->as_array() as $key=>$result) 
    { 
     if(!in_array($result['tag_id'], $tags)) 
     { 
      $tags[$result['tag_id']] = array(); 
     } 
    } 

    foreach($results->as_array() as $result) 
    { 
     array_push($tags[$result['tag_id']], array($result['fk_language_id'] , $result['tag_name'])); 
    } 

這是預期的結果:

Array ( 
    [19] => Array ( 
     [0] => Array ( 
       [0] => 1 
       [1] => test 
      ) 
     ) 
    [20] => Array ( 
     [0] => Array ( 
       [0] => 1 
       [1] => testa 
      ) 
     [1] => Array ( 
       [0] => 3 
       [1] => fdfda 
      ) 
     ) 
) 

不過,我有兩個迴路在這裏,我知道這是不理想的。爲什麼這些不起作用?

$tags = array(); 
    foreach($results->as_array() as $key=>$result) 
    { 
     $tags[$result['tag_id']] .= array($result['fk_language_id'] , $result['tag_name']); 
    } 

有了這個例子中,我得到兩個空數組...

Array ([19] => Array [20] => ArrayArray) 

甚至......

$tags = array(); 
    foreach($results->as_array() as $key=>$result) 
    { 
     if(!in_array($result['tag_id'], $tags)) 
     { 
      $tags[$result['tag_id']] = array(); 
     } 
     array_push($tags[$result['tag_id']], array($result['fk_language_id'] , $result['tag_name'])); 
    } 

由於某種原因與覆蓋的二數組的第一個值第二個數組的第二個值。

Array ( 
    [19] => Array ( 
     [0] => Array ( 
       [0] => 1 
       [1] => test 
      ) 
     ) 
    [20] => Array ( 
     [0] => Array ( 
       [0] => 3 
       [1] => fdfda 
      ) 
     ) 
) 

我在做第二個例子中的錯誤是什麼?

回答

1

要回答您的問題,您的第二種方法失敗,因爲您使用的是不正確的.=運算符。您的第三種方法失敗,因爲您的!in_array檢查始終爲false(它會檢查是否在陣列中,而不是是否已設置)並在每次迭代中覆蓋陣列。你只是真的需要這個(正如其他人提到的,在僞代碼中):

$result = array(); 
foreach ($array as $values) { 
    $result[$values['key']][] = array($values['foo'], $values['bar']); 
} 
1

.=運算符是字符串連接。陣列與+=合併。

如果我正確認識這個問題,代碼應該是這樣的:

$tags = array(); 
foreach ($results as $result) 
    $tags[$result['tag_id']][] = array($result['fk_language_id'], $result['tag_name']); 
+0

這是最後一個例子的粗略等價物,並且不起作用。這也消除了最後的結果。請記住,我需要連接多個結果。 + =給我不受支持的操作數類型。 –

+0

你不需要協調。連接是連接兩個字符串,而不是合併數組。如果實際使用錯誤的操作數,'+ ='會給你不支持的操作數類型,也就是說,你做錯了什麼。檢查我編輯的答案 - 它給出你所需要的結果。 – mingos

0
$tags = array(); 
foreach($results->as_array() as $key=>$result) 
{ 
    $tags[$result['tag_id']] .= array($result['fk_language_id'] , $result['tag_name']); 
} 

你不能添加值與數組=(點等於)。

你爲什麼要做$ results-> as_array()?

做簡單地:。

foreach($results as $key=>$result) { 
+2

as_array似乎是$結果中的一種特殊方法。你不知道$結果是否可以迭代。 – cwallenpoole

+0

是的,這是一個對象的操作 –

0

代替使用=嘗試使用[]

$tags = array(); 
foreach ($results as $result) 
{ 
    if(!isset($tags[$result['tag_id']])) 
     $tags[$result['tag_id']] = array(); 
    $tags[$result['tag_id']][] = array($result['fk_language_id'], result['tag_name']); 
} 

=是concatinate字符串 + =是concatinate若干 []是對協調一個陣列

希望這會有幫助嗎?

編輯:注意到如果tag_id不存在於數組中,它可能會失敗,所以它可能值得先檢查並將其設置爲數組以防萬一。

+1

如果'tag_id'不存在,它不會失敗,您不需要顯式創建一個新的數組。 – deceze