PHP Array добавить значения - PullRequest
0 голосов
/ 24 ноября 2011

У меня проблема с добавлением нескольких опций в массив модулей.Я использую 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;

Print Array, без изображения или большого пальца:

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

)

Когда я делаю array_push, мне нужно назначитьэто обратно в массив?

Ответы [ 3 ]

2 голосов
/ 24 ноября 2011

$ модуль перезаписывается циклом foreach () каждый раз, когда он повторяется.Таким образом, ваш push в основном нулевой, потому что foreach уничтожит предыдущий $ module (который вы нажали) со следующим значением $ module, полученным из $ modules.Вам нужно что-то более похожее на это:

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

Модуль & before $ в foreach превращает его в ссылку, поэтому любые изменения в $module внутри цикла изменят исходный элемент в$ modules, а не копия, которая будет выбрасываться на каждой итерации.

1 голос
/ 24 ноября 2011

$ module, в вашем цикле foreach есть копия содержимого. Вам нужно будет получить к нему доступ по ссылке или отправить обратно в реальный массив $ modules.

Попробуйте изменить подпись foreach следующим образом:

foreach ($modules as &$module) {
0 голосов
/ 24 ноября 2011

попробуйте использовать array_merge вместо array_push

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

edit:

также, поскольку print_r выводит правильное значение должно быть array_merge($module[0], array(...));

...