Проблема с построением массивов в разных стилях кодирования - PullRequest
1 голос
/ 27 июня 2011

У меня странная проблема при построении массивов. Я начинаю с массива, который выглядит следующим образом:

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

Что я делаю не так во 2-х примерах?

Ответы [ 4 ]

1 голос
/ 27 июня 2011

Чтобы ответить на ваш вопрос, ваш второй метод не работает, потому что вы используете неправильный оператор .=.Ваш третий метод дает сбой, потому что ваша проверка !in_array всегда false (она проверяет, находится ли значение в массиве, а не установлена ​​ли клавиша ) и перезаписывает массив каждыйитерация.Вам действительно нужно это (как уже упоминалось другими в псевдокоде):

$result = array();
foreach ($array as $values) {
    $result[$values['key']][] = array($values['foo'], $values['bar']);
}
1 голос
/ 27 июня 2011

Оператор .= является конкатенацией строк. Массивы объединяются с +=.

Если я правильно понимаю проблему, код должен выглядеть следующим образом:

$tags = array();
foreach ($results as $result)
    $tags[$result['tag_id']][] = array($result['fk_language_id'], $result['tag_name']);
0 голосов
/ 27 июня 2011

Вместо использования. = Попробуйте использовать []

$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 еще не существует в массиве, поэтому, возможно, стоит просто проверить сначала и установить его на массив на всякий случай.

0 голосов
/ 27 июня 2011
$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) {
...