在不同编码风格下构建数组的问题

时间:2011-06-26 22:21:16

标签: php arrays loops operators

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

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

在后两个例子中我做错了什么?

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分: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) {

答案 3 :(得分: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']);
}

。=是连接一个字符串 + =是一个数字 []是连接到数组

希望这有帮助吗?

编辑:注意到如果数组中还没有tag_id,它“可能”会失败,因此可能值得先检查并将其设置为数组以防万一。