使用不同编码样式构建阵列的问题


Problem with Building Arrays in Different Coding Styles

我在构建数组时遇到了一个奇怪的问题。我从一个看起来像这样的数组开始:

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 
           ) 
       ) 
 ) 

第二个例子中我做错了什么?

要回答您的问题,您的第二个方法会失败,因为您使用了不正确的.=运算符。第三个方法失败,因为!in_array检查始终是false(它检查是否在数组中,而不是是否设置了),并在每次迭代时覆盖数组。你只需要这个(正如其他人提到的,在伪代码中):

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

.=运算符是字符串串联。数组与+=合并。

如果我正确理解这个问题,代码应该是这样的:

$tags = array();
foreach ($results as $result)
    $tags[$result['tag_id']][] = array($result['fk_language_id'], $result['tag_name']);
$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) {

而不是使用。=尝试使用[]

$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']);
}

.=就是把一根绳子凹进去+=是将一个数字凹入[]是凹入阵列

希望这有帮助?

编辑:注意到,如果数组中不存在tag_id,它"可能"会失败,因此可能值得先检查一下,并将其设置为数组以备不时之需。