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);
      }
    }
  }


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

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

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

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

Похожие вопросы