Хочется элегантно получить элемент массива возвращаемого методом

QQQ

Новичок
AmdY
интересное и простое решение.. почему-т я сам не додумался


А вот ещё "глюки" синтаксиса:

PHP:
$Var = 'value';
$Arr['elem'] = 'value';

$name = "Var";
print $$name; // печатает естественно value

$name = "Arr";
print $$name; // печатает естественно Array

$link = &$$name;
print $link['elem']; // печатает естественно value


print $$name['elem']; // ошибка


$s_name = "Arr['elem']";
print $$s_name;	// аналогичная фигня: ошибка
 

Nelius

кипарис во дворе
Кстати вопрос по теме... может и глупый но все же задам...
Есть простенький класс
PHP:
class Foo {
	protected $data=array();

	public function get($key) {
		return $this->data[$key];
	}
}
Данные храняться в ассоциативном, одномерном массиве $data метод get возвращает значение по ключу...
Так вот вопрос, как красиво реализовать метод get если массив не одномерный, а, например 5-мерный? Или вообще n-мерный...
Реализовать я могу, но моя реализация мне не кажется слишком изящной)))
 

Striker

Новичок
ну могу предположить, допустим так

PHP:
$keys = array($key1, $key2, $key3);

public function get($keys)
{
    $value = $this->$data;
    foreach ($keys as $key)
    {
        $value = $value[$key];
    }
    return $value;
}
 

Nelius

кипарис во дворе
Не, нужен один элемент например
PHP:
$data['apple']['juice']['s_myakotyu']['bez_kostochek'] = 'Хренасе у вас запросы!';
$data['oranges'] = '15';
Вот метод должен уметь возвращать значения как для первого, так и для второго случая)
 

phpdev2007

Новичок
Автор оригинала: Nelius
Не, нужен один элемент например
PHP:
$data['apple']['juice']['s_myakotyu']['bez_kostochek'] = 'Хренасе у вас запросы!';
$data['oranges'] = '15';
Вот метод должен уметь возвращать значения как для первого, так и для второго случая)
Да многомерный массив так просто не сделать, в ручном режиме конечно просто, а программно далеко не просто
в ручном режиме это выглядит так:

PHP:
$data['apple']['juice']['s_myakotyu']['bez_kostochek'] = 'Хренасе у вас запросы!';
$data['oranges'] = '15';

$obj->apple->juice->s_myakotyu->bez_kostochek = 'Хренасе у вас запросы!';
$obj->oranges = 15;

var_dump($obj);

$obj2->{1} = 'индекс числовой';
var_dump($obj2);
echo $obj2->{1};
Причем программно нужно сделать это автоматически просто передав массив в метод класса, в ответ получив обьект который при обращении:
echo $obj->apple->juice->s_myakotyu->bez_kostochek;
Выведет: Хренасе у вас запросы!
 

Nelius

кипарис во дворе
Для 4-мерного массива, я сделал так, оно работает, но как-то оно меня смущает)))
PHP:
public function get($key) {
		$key = explode(',',$key);
		switch (count($key)) {
			case 1:	return $this->data[$key[0]]; break;
			case 2:	return $this->data[$key[0]][$key[1]]; break;
			case 3:	return $this->data[$key[0]][$key[1]][$key[2]]; break;
			case 4:	return $this->data[$key[0]][$key[1]][$key[2]][$key[3]]; break;
			default: return $this->data[$key[0]]; break;
		}
}

print $obj->get('apple,juice,s_myakotyu,bez_kostochek');
вернет "Хренасе у вас запросы!"
 

Striker

Новичок
Nelius
а чем мой вариант не устраивает? зачем городить switch case?
 

Nelius

кипарис во дворе
Striker
Ваш вариант устраивает) Спасибо!
Просто хочется узнать еще способов.
Мой например самый кривой))) Поэтому и хочу узнать как еще можно...
Вот phpdev2007 еще реаллизацию подсказал...
 

phpdev2007

Новичок
Striker
Хочеться получить данные следующим видом:
echo $obj->apple->juice->s_myakotyu->bez_kostochek

не через указания ключей - параметров через метод.
 

Nelius

кипарис во дворе
В идеале конечно вот как хочется...
Например класс Config хранит данные конфигурации в многомерном массиве.
Мы его создаем
PHP:
$cfg = new Config();
$cfg->load();

print $cfg->apple->juice->sugar;
Вот так конечно совсем хорошо было бы, вот я и разбираюсь щас читаю как можно это дело замутить...
 

phpdev2007

Новичок
Я знаю одну библиотеку которая умеет такое делать сказать?
ZF
Zend_Config
именно так она и делает с конфигами :)
 

Nelius

кипарис во дворе
=) Афигеть я опять изобрел велосипед)))
Спасибо пойду смотреть)
 

QQQ

Новичок
А вот ещё "глюк":

PHP:
function mEmpty(&$var) { return empty($var); }

$b = '';

if(mEmpty($a = $b)) { /* отработает */ }

if(empty($a = $b)) { /* будет ошибка */ }

Не пора ли разработчиком php наконец отказаться от псевдофункций, являющихся почему-то конструкциями языка?
 

Pigmeich

Новичок
QQQ
По си-плюсовым блогам недавно пробегала история с неправильно работающим abs в гнутом си.

Так что это у всех такая проблема. Лечится отстрелом всех разработчиков компиляторов. Только на чем писать-то будем?
 
Сверху