0

モジュールの配列にいくつかのオプションを追加する際に問題が発生しました。Opencartを使用していて、画像を追加してモジュールを拡張しようとしています。これを行い、コードが将来何も壊さないようにするために、配列を置き換えるのではなく、配列に追加したいと思いました。

これは私がこれまでに持っているコードです:

if (isset($this->request->post['special_module'])) {
    $modules = $this->request->post['special_module'];
} elseif ($this->config->get('special_module')) { 
    $modules = $this->config->get('special_module');
}

$this->load->model('tool/image');

foreach ($modules as $module) {
    if (isset($module['image']) && file_exists(DIR_IMAGE . $module['image'])) {
        $image = $module['image'];
    } else {
        $image = 'no_image.jpg';
    }           

    array_push($module, array(
        'image'        => $image,
        'thumb'        => $this->model_tool_image->resize($image, 100, 100)
    )); 
} 
print_r($modules);exit;
$this->data['modules'] = $modules;

アレイを印刷します。画像や親指はありません。

Array
(
    [0] => Array
        (
            [image_width] => 307
            [image_height] => 234
            [layout_id] => 1
            [position] => column_right
            [status] => 1
            [sort_order] => 1
        )

)

array_pushを実行するとき、これを配列に割り当てる必要がありますか?

4

3 に答える 3

2

$ moduleは、反復するたびにforeach()ループによって上書きされます。したがって、プッシュは基本的にnull-opです。これは、foreachが前の$ module(プッシュ先)を破棄し、次の$module値が$modulesから出力されるためです。次のようなものが必要になります。

foreach($modules as &$module) {
    ...
    $module['image'] = $image;
    $module['thumb'] = ...;
}

&foreachのbefore$moduleはそれを参照に変換するため$module、ループ内で変更を加えると、反復ごとに破棄されるコピーではなく、$modulesの元の要素が変更されます。

于 2011-11-24T15:11:21.113 に答える
1

$ module、foreachループには、コンテンツのコピーがあります。参照によってアクセスするか、実際の配列$modulesにプッシュバックする必要があります。

foreach署名を次のように変更してみてください。

foreach ($modules as &$module) {
于 2011-11-24T15:13:50.020 に答える
0

array_pushの代わりにarray_mergeを使用してみてください

array_merge($module, array(
    'image'        => $image,
    'thumb'        => $this->model_tool_image->resize($image, 100, 100)
)); 

編集:

また、print_rの出力として、正しいものは次のようになります。array_merge($module[0], array(...));

于 2011-11-24T15:13:47.850 に答える