2016-04-08 4 views
0

У меня есть некоторые ассоциативные массивы, которые хранят лексические данные для словаря. Ниже приведен пример структуры из массива называется $rowArray:Значения массива не обновляются после foreach()

[2] => Array 
     (
      [\lx] => gunu 
      [\np] => LH 
      [\ps] => noun 
      [\ge] => thick grass in the field, thicket 
      [\gn] => tshutlha 
      [\lt] => 
      [\va] => 
      [\cf] => 
      [\ce] => 
      [\nt] => 
      [\oi] => gunu [LH] thick grass in the field, thicket (noun) (Sets. tshutlha) 
     ) 

    [3] => Array 
     (
      [\lx] => guru 
      [\np] => S 
      [\ps] => noun 
      [\ge] => ankle 
      [\gn] => lenyenyana 
      [\xv0] => ʔam guru-ŋǀı̃ 
      [\xe0] => my ankles 
      [\lt] => 
      [\va] => 
      [\cf] => 
      [\ce] => 
      [\nt] => 
      [\oi] => guru [S] ankle (noun) (Sets. lenyenyana) (ex. ʔam guru-ŋǀı̃ ‘my ankles’) 
     ) 

Я создаю таблицу, и мне нужно, чтобы создать строку заголовков эквивалентно ключей в массиве выше (например, заголовки будут в \ лк \ np \ ps ...) Я сохраняю эти значения в отдельном массиве с именем $headArray.

Проблема в том, что некоторые массивы имеют больше значений, чем другие, поэтому, когда я создаю таблицу, столбцы смещены. Например, в приведенном выше [2] имеется 11 значений, но в [3] выше 13 значений. Таким образом, в электронной таблице столбцы не совпадают точно.

Поэтому я первый переборе всех ключей от $rowArray для заполнения $headArray (таким образом, он всегда будет иметь максимально возможное количество товарных позиций возможных):

$headArray = array(); 
      foreach($rowArray as $j=>$rA){ 
       foreach($rA as $r=>$a){ 
        if(!in_array($r, $headArray)){ 
         $pos = array_search($r, array_keys($rA)); 
         array_splice($headArray, $pos, 0, $r); 
        } 

       } 
      } 

Вывод этого кода является массив со всеми возможными заголовками в правильном порядке:

Array 
(
    [0] => \lx 
    [1] => \np 
    [2] => \ps 
    [3] => \ge 
    [4] => \gn 
    [5] => \xv0 
    [6] => \xe0 
    [7] => \xv1 
    [8] => \xe1 
    [9] => \lt 
    [10] => \va 
    [11] => \cf 
    [12] => \ce 
    [13] => \nt 
    [14] => \oi 
) 

А потом я использую этот список ($headArray) для перебора всех записей в $rowArray - если запись в $rowArray отсутствует ключ, который $headArray имеет, затем я вставляю его и делаю пустым. Фактически, я создаю пустые столбцы в своей таблице, чтобы все выравнивало независимо от того, что. Для этой итерации, я использую этот код:

foreach($rowArray as $j=>$rA){ 
       if(count($rA) < count($headArray)){ 
        $rA_keys = array_keys($rA); 
        $rA_diff = array_diff($headArray, $rA_keys); 
        foreach($rA_diff as $di=>$ff){ 
         if(!array_key_exists($ff, $rA)){ 
          $rA = array_slice($rA, 0, $di, true) + array($ff => '') + array_slice($rA, $di, NULL, true);  
         } 
        } 
       } 

      } 

Вывода этого кода следующим образом (сравните с первым массивом в этом посте):

Array 
    (
     [\lx] => gunu 
     [\np] => LH 
     [\ps] => noun 
     [\ge] => thick grass in the field, thicket 
     [\gn] => tshutlha 
     [\xv0] => 
     [\xe0] => 
     [\xv1] => 
     [\xe1] => 
     [\lt] => 
     [\va] => 
     [\cf] => 
     [\ce] => 
     [\nt] => 
     [\oi] => gunu [LH] thick grass in the field, thicket (noun) (Sets. tshutlha) 
    ) 
Array 
(
    [\lx] => guru 
    [\np] => S 
    [\ps] => noun 
    [\ge] => ankle 
    [\gn] => lenyenyana 
    [\xv0] => ʔam guru-ŋǀı̃ 
    [\xe0] => my ankles 
    [\xv1] => 
    [\xe1] => 
    [\lt] => 
    [\va] => 
    [\cf] => 
    [\ce] => 
    [\nt] => 
    [\oi] => guru [S] ankle (noun) (Sets. lenyenyana) (ex. ʔam guru-ŋǀı̃ ‘my ankles’) 
) 

Он работает, я думаю! Таким образом, при всем этом фоне знания в виду, мои вопросы:

1. Вне этих foreach петель, даже если результаты print() правильно, массивы не обновляются. Например, когда я пытаюсь записать массивы в свою электронную таблицу, обновленные значения с помощью сплайсинга и всего этого материала НЕ сохраняются. Итак, как я могу сделать так, чтобы массивы обновлялись в моих петлях foreach?

2. Есть ли логически более эффективный или лучший способ делать то, что я делаю? Эта задача дала мне головную боль в течение 4 дней, и я не уверен, что мой метод является лучшим!

+0

^^ Это то, что вы ищете. –

ответ

0

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

  1. Найти правильный заголовок, как вы хотите.
  2. Прежде чем вводить данные в excel с помощью специальных функций библиотеки, которые берут строку и столбец файла excel, создайте временный массив, итерируя значения из ваших массивов. Если некоторые значения заголовка не найдены, оставьте их пустыми.
  3. После создания этого временного массива, который соответствует вашему заголовку, вставьте эти значения в файл excel.
+0

Я использую эту библиотеку для этого, но я вставляю целые строки за один раз, используя этот метод: '$ objPHPExcel-> getActiveSheet() -> fromArray()', но я думаю, что для этого вам понадобится начать все путь от начала, который у меня нет времени. – SanguineEpitaph

+0

Я думаю, что использование setCellValue() проще и безопаснее, вы можете найти документ, как использовать здесь: https://gist.github.com/r-sal/4313500 –

Смежные вопросы