[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: имя массива
Страницы: 1, 2
paul85
Доброго дня, дорогие гуру!

Наверное мой вопрос прозвучит довольно-таки глупо, поэтому пишу в ветку для начинающих. Вот есть такая ситуация: имя ассоциативного массива хранится в переменной. То есть:

class foo
{
public $arr=array('1'=>'привет', '2'=>'пока');

public function showArray($name)
{
print_r($this->$name); //Срабатывает.
}

public function addMember($name, $key, $value)
{
//????
}
}


$a = new foo();
$a->showArray('arr');
$a->addMember('arr', '22', 'значение22');
$a->showArray('arr');


Пробовал использовать array_merge, но он, зараза, пересчитывает индексы. А мне этого категорически не нужно! Поменять индексы и значения местами в массиве тоже плохая идея - неизвестно что там будет. А ключ как я понял совершенно даже не все символы воспринимает.

http://stackoverflow.com/questions/1069606...-php-array-keys

Какие есть идеи добавить элемент в массив?
sign63
Ты про это?

$test = array();

$key = '3';
$value = 'эхо';

$test[$key]=$value;
print_r($test);


_____________
user posted image
paul85
sign63, нет, данная конструкция мне хорошо известна. =) Задача хранить имя массива в переменной и добавить к нему элемент.

Если напишу так:
$this->$name[$key]=$value

То интерпретатор воспримет как обращение к ключу массива $name. А это вовсе и не массив даже... Экспериментировал с синтаксисом по-разному, ничего так и не вышло. Надо как-то объяснить PHP, что индекс берем не от текущей переменной, а от той, которая получится после подстановки. Вот в чем засада...

Наверное это невозможно сделать. Но на всякий случай решил спросить...
linker
$this->{$name}[$key] = $value;


_____________
Gear Framework
Gear Framework на Github
Игорь_Vasinsky
во первых - почему ни кто не заметил - что речь идёт о свойстве класса?

$arr - является существующим публичным свойством

а на лету свойства не возникают.


а вот так можно проверить и если свойства нет - то создать его

        private function checkProperty($name){
if(!property_exists(__CLASS__, $name)){
$this->createProperty($name,$name);
$this->name = $name;
}
else
$this->name = $name;
}


а потом уже напичковать его

но тока нафиг их плодит безбожно - когда достаточно из $arr - сделать 2у уровневый массив -и сохдавать в нём массивы - скока душе угодно

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
linker
Игорь_Vasinsky
Ты забыл, что это php, свойства у класса МОГУТ возникать на лету
class foo {}
$a = new foo();
$a->b = 1;
print_r($a);


_____________
Gear Framework
Gear Framework на Github
paul85
linker, гениально! Чего ж я сам-то не допер... Досадно как... =) Опыта мало!

Игорь_Vasinsky, да там у меня свойства все определены. Как справочники идут - новых не будет. Просто лохонулся с синтаксисом, вот и всё. =)
paul85
Что-то вроде микро базы-данных. Подставляю значения из справочников, чтобы каждый раз БД не дергать, - так в разы быстрее получается.
Игорь_Vasinsky
а если внутри класса так попробовать - ? выйдет? я не помню точно, но меня же засыпало ошибками, я к верхнему варианту пришёл.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
linker
Игорь_Vasinsky
А какая разница
class foo 
{
public function b() { $this->b = 1; }
}

$a = new foo();
$a->b();
print_r($a);

От перестановки мест слагаемых сумма ведь не меняется.

_____________
Gear Framework
Gear Framework на Github
linker
Цитата (paul85 @ 6.02.2014 - 08:09)
Что-то вроде микро базы-данных. Подставляю значения из справочников, чтобы каждый раз БД не дергать, - так в разы быстрее получается.

Кэш? Нет, не пробовал?

_____________
Gear Framework
Gear Framework на Github
Игорь_Vasinsky
да уж. буквально месяца 3 назад - гуглил и нашёл такое решение для динамически добавления свойств.

видимо по тексту ошибки на гуглил.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
paul85
Цитата (linker @ 6.02.2014 - 09:12)
Кэш? Нет, не пробовал?

Честно говоря нет. Не пробовал еще. )
sergeiss
Цитата (Игорь_Vasinsky @ 6.02.2014 - 09:02)
а на лету свойства не возникают.

Цитата (linker @ 6.02.2014 - 09:05)
Ты забыл, что это php, свойства у класса МОГУТ возникать на лету

И никто не сказал про "магический" метод класса __get(), который позволят "создавать" любые свойства. Слово "создавать" я специально поставил в кавычки, потому что на самом деле новых свойств не создается. Но, в то же время, формально это выглядит так, будто новые свойства создаются прямо вот в процессе работы.
И мне кажется, что ТС именно это и хочет. Тем более, что при загрузке данных из БД в класс, когда заранее не известен набор полей, магические свойства очень даже полезны будут.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
zelenuy
;) Вы про эти магические методы:

<?php
class
foo{

public $arr = [];

public function __get($name){
print_r($this->arr["$name"]);
}

public function __set($key, $value){
$this->arr["$key"] = $value;
}
}


$a = new foo();
$a->name = 'Вася Пупкин';
$a->age = 23;
$a->email = 'pupcin@mail.com';
//Вывод на экран в место showArray($name)
$a->name;
$a->age;
$a->email;
//Вывести все
print_r($a->arr);
?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.