0

入力でCSVを受け取るPHPアプリケーションがあります。最初の列には、カテゴリとサブカテゴリの両方が「|」で分割されています。これをOpenCartDBに入れる必要があります。このDBには、CategoryとSubcategoryの同じテーブルがあります(「parent_id」列は、Categoryのcategory_idを示します)。次のように、必要なすべてのフィールドを含むクラスを作成することを考えました。

class Categorie {
    public $category_id;
    public $parent_id;
    public $image;
    public $top;
    public $column;
    public $sort_order;
    public $status;
    public $date_modified;
    public $date_added;
    public $language_id;
    public $name;
    public $description;
    public $meta_description;
    public $meta_keywords;
}

次に、データを分析します。

$categorie = array();
while ( ( $riga_file = fgetcsv( $file, 100000, "\t" ) ) !== false )
{
     $array_el = count( $riga_file );
     for( $el_cur = 0; $el_cur < $array_el; $el_cur++ )
     {
         switch ( $el_cur )
         {
             case 0:
             $colonne = explode( "|", $riga_file[$el_corr] );
             $categoria = new Categorie();
             $categoria->image = "";
             $categoria->top = 1;
             $categoria->column = 1;
             // ... bla adding description data
             if( $categorie[$colonne[0]] == NULL ) // (1)
             {
                 $categoria->name = $colonne[0];
                 $categoria->category_id = $id_categoria;
                 $categoria->parent_id = 0;
                 $categorie[$colonne[0]] = $categoria;
                 $id_categoria++;
             }
             if( $colonne[1] != NULL ) // (2)
             {
                 $categoria->name = $colonne[1];
                 if( $categorie[$colonne[1]] == NULL )
                 {
                     $categoria->category_id = $id_categoria;
                     $categoria->parent_id = $categorie[$colonne[0]]->category_id;
                     $categorie[$colonne[1]] = $categorie;
                     $id_categoria++;
                 }
             }
             break;
         }   

次のような一意のオブジェクトのコレクションで満たされた配列が必要です。

  // OUT(3)
  Category 1
  Subcategory 1
  Category 2
  Subcategory 2...

(1)と(2)の中に$ category($ categoryではない)のエコーを入れると、OUT(3)に書き留めた内容が正確にわかり、「エンジン」が正しいと思います。配列を検索しようとすると、問題が発生します。

echo "<table border='1'>";
            foreach( $categorie as $value )
            {
                echo "<tr>
                           <td>$value->category_id</td>
                           <td>$value->parent_id</td>
                           <td>$value->name</td>
                      </tr>";
            }
            echo "</table>";

カテゴリをまったく取得しておらず、すべてではありませんがほとんどのサブカテゴリを取得しているためです。私は「検索エンジン」で何か間違ったことをしているのでしょうか、それともPHP配列で何かを誤解しているのでしょうか(おそらく私はC ++から来ており、このphpが私の頭を悩ませているからです)。

4

1 に答える 1

0

私は問題を解決しました、またはそれ以上に問題を解決しました。

1) 変数のスペルを間違えました: (2) で次のように書きました:

$categorie[$colonne[1]] = $categorie;

正しい書き方は次のとおりです。

$categorie[$colonne[1]] = $categoria;

2)より大きな問題は、PHPの「知らない」からでした。実際、問題1を修正しました。次のような出力が得られました。

subcategory1
subcategory1
subcategory2
subcategory2

等々。これにより、私がそうするときに次のように推測することができました:

$categorie[$colonne[1]] = $categoria;

PHP は内部の値をコピーしませんが、代わりにアドレスを使用します。正しいコードに従います:

switch ( $el_corr )
                    {
                        case 0:                                                 // Categorie e sottocategorie
                            $colonne = explode( "|", $riga_file[$el_corr] );
                            $categoria = new Categorie();
                            $categoria->image = "";
                            $categoria->top = 1;
                            $categoria->column = 1;
                            $categoria->sort_order = 0;
                            $categoria->status = 1;
                            // Category_Description Campi
                            $categoria->language_id = 1;
                            $categoria->name = $colonne[0];
                            $categoria->description = "";
                            $categoria->meta_description = "";
                            $categoria->meta_keywords = "";
                            ////////////////////////
                            if( $categorie[$colonne[0]] == NULL )
                            //if( !trova_categorie( $colonne[0], $categorie ) )
                            {
                                $categoria->name = $colonne[0];
                                $categoria->category_id = $id_categoria;
                                $categoria->parent_id = 0;
                                $categorie[$colonne[0]] = $categoria;
                                $id_categoria++;
                            }
                            $categoria = new Categorie();
                            $categoria->image = "";
                            $categoria->top = 1;
                            $categoria->column = 1;
                            $categoria->sort_order = 0;
                            $categoria->status = 1;
                            // Category_Description Campi
                            $categoria->language_id = 1;
                            $categoria->name = $colonne[0];
                            $categoria->description = "";
                            $categoria->meta_description = "";
                            $categoria->meta_keywords = "";
                            if( $colonne[1] != NULL )
                            {
                                $categoria->name = $colonne[1];
                                if( $categorie[$colonne[1]] == NULL )
                                //if( !trova_categorie( $colonne[1], $categorie ) )
                                {
                                    $categoria->category_id = $id_categoria;
                                    $categoria->parent_id = $categorie[$colonne[0]]->category_id;
                                    $categorie[$colonne[1]] = $categoria;
                                    $id_categoria++;
                                }
                            }
                            break;
                    } 
于 2012-12-04T13:02:43.347 に答える