2016-04-08 20 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’) 
     ) 

(例えば見出しは、\ LX \だろうnp \ ps ...)これらの値を$headArrayという別の配列に格納しています。

問題は、一部の配列の値が他の配列よりも大きいため、スプレッドシートを作成するときに列の位置がずれることです。たとえば、上記の[2]には11個の値がありますが、上記の[3]には13個の値があります。したがって、スプレッドシートでは、列が正確に一致しませんでした。

したがって、私は最初に(その方法は、それが常に可能で見出しの最大#を持つことになります)$headArrayを移入するために$rowArrayのすべてのキーを反復処理しています:

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

そして私は$rowArray内のエントリのすべてを反復処理するために、このリスト($headArray)を使用する -のエントリ場合3233に$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’) 
) 

それは動作しますが、私は思います!だから、心の中でこのような背景知識のすべてで、私の質問は以下のとおりです。これらのforeachループの

1.外では、結果が正しく、配列は更新されません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 –

関連する問題