tripcollor
@tripcollor

Как в цикле php переопределить (перезаписать) исходный массив который передается в функцию в виде параметра?

Я хочу создать многомерный массив меню у меня есть одномерный массив меню, который получается из БД.
В нем есть такие поля: "id ", "parent_id", "title".
На время разработки я упростил немного массив и убрал поле "url".

Вся проблема в том что я не могу перезаписать массив который передается как параметр в функцию, а могу только сделать дубликат этого массива, но это мне не подходит.

Вот отрывок кода который не отрабатывает как я хочу. Нужно чтобы $this->menu массив изменился (чтобы туда для каждого элемента добавился ключ "lavel" с определенным значением) в результате отработки функции function buildMenu() в которую он передается в качестве параметра, как это сделать?

Сейчас в принте выводится старая не измененная версия массива.

<?php
class Menu{

  protected $menu = [
    [ 'id' => 1,  'parent_id' => 0, 'title' => 'Главная' ],
    [ 'id' => 2,  'parent_id' => 0, 'title' => 'Категории' ],
    [ 'id' => 3,  'parent_id' => 2, 'title' => 'Спорт' ],
    [ 'id' => 4,  'parent_id' => 3, 'title' => 'Тенис' ],
    [ 'id' => 5,  'parent_id' => 3, 'title' => 'Баскетбол' ],
    [ 'id' => 6,  'parent_id' => 2, 'title' => 'IT' ] ,
    [ 'id' => 7,  'parent_id' => 6, 'title' => 'Пограммирование' ],
    [ 'id' => 8,  'parent_id' => 5, 'title' => 'Турниры' ],
    [ 'id' => 9,  'parent_id' => 0, 'title' => 'Товары' ],
    [ 'id' => 10, 'parent_id' => 11, 'title' => 'Компьютеры' ],
    [ 'id' => 11, 'parent_id' => 9, 'title' => 'Техника' ],
    [ 'id' => 12, 'parent_id' => 9, 'title' => 'Мячи' ],
  ];

  public function __construct(){
    $this->getMenu();
  }

  protected function getMenu(){

    $this->buildMenu($this->menu);

    echo('<pre>');
      print_r($this->menu);
    echo('</pre>');

  }

  protected function buildMenu($menu, $pid = 0, $level = 0) {
    foreach ($menu as $item) {
      if($item['parent_id'] == $pid){
        $item['level'] = $level;
        $this->buildMenu($menu, $item['id'], $level + 1);
      }
    }
  }
}

new Menu();


Напомню что мне нужно сделать именно тем методом которым я описал , я знаю что можно создать новый массив и скопировать туда все значения или
даже так
protected function buildMenu($menu, $pid = 0, $level = 0) {
    foreach ($menu as $i=>$item) {
      if($item['parent_id'] == $pid){
        $this->menu[$i]['level'] = $level;
        $this->buildMenu($menu, $item['id'], $level + 1);
      }
    }
  }


Тут я описал так сказать надуманную задачу, чтобы не приводить весь код который у меня есть тут и дабы узнать возможно ли сделать то что я хочу
  • Вопрос задан
  • 399 просмотров
Решения вопроса 1
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Видимо так
php.net/manual/en/language.references.pass.php

Тут я описал можно так сказать надуманную задачу, чтобы не приводить весь код который у меня есть тут и дабы узнать возможно ли сделать то что я хочу

Вообще непонятно что вы хотите, лучше бы это и написали, а то похоже на бред сумасшедшего всё это. Знать как минимум 2 решения, но не использовать потому что "надо именно тем методом", без указания причин почему так надо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы