return array() — как обратиться напрямую?

Не о CI, но о PHP, интерфейсах и веб-проограммировании

return array() — как обратиться напрямую?

Сообщение wave » 28 сен 2009, 00:30

У меня дурацкий и очень чайниковский вопрос, который всё не даёт покоя.
Есть функция (метод), которая возвращает массив. Как обратиться к элементу массива без промежуточных переменных?
Поясню: стандартная ситуация для CI
Код: Выделить всё
if ($query->num_rows() > 0)
{
    foreach ($query->result_array() as $value)
    {
        //do something; echo $value
    }
}
 

Если я заранее знаю, что у меня вернулся один элемент, мне незачем организовывать цикл. Проще бы обратиться как-то так:
$query->result_array()[0]  или $query->result_array()->array[0]
Но тут уже как только ни пробовал, не получается. Только
Код: Выделить всё
$res = $query->result_array();
echo $res[0]; 

Не нашёл ни в мануале, ни в гугле, как обратиться к первому элементу массива, возвращаемого функцией, без дополнительных переменных и циклов. И можно ли вообще.
wave
 
Сообщения: 48
Зарегистрирован: 04 фев 2009, 00:32

Re: return array() — как обратиться напрямую?

Сообщение Big_Shark » 28 сен 2009, 01:55

$query->row()->переменная;
вроде так
Отвечу на ваши вопросы по CodeIgniter и Kohana3
Благодарности принимаются тут: 41001216991355 (ЯД)
Big_Shark
Модератор
 
Сообщения: 1307
Зарегистрирован: 03 фев 2009, 02:12
Откуда: Владивосток

Re: return array() — как обратиться напрямую?

Сообщение wave » 28 сен 2009, 02:16

Это немного не то, что требуется. К тому же частный случай. Обратиться к возвращаемому массиву может хотеться не только в AR в CI.

$query->result_array() возвращает массив, $query->row() возвращает объект. И в случае, который истощил терпение, получается такая петрушка:
Код: Выделить всё
$images $query->result_array();
$out .= $this->showThumb($images[0]); 

$images[0] — это тоже массив. И через $query->row()->имя — мне нужно переписывать метод showThumb, чтобы он принимал не массив, а объект (потому что по одному свойству — куда хуже). Никакой выгоды. Я бы уже предпочёл услышать ответ «никак» и традиционно использовать промежуточный массив.
wave
 
Сообщения: 48
Зарегистрирован: 04 фев 2009, 00:32

Re: return array() — как обратиться напрямую?

Сообщение Tovit » 28 сен 2009, 07:48

Код: Выделить всё
list($images) = $query->result_array();
 

Оператор list решает такие проблемы. Например, 2 элемента
Код: Выделить всё
list($foo$bar) = array('foo''bar');
echo 
$foo//foo
echo $bar//bar
 
-- это глупый пример как раз демонстрирует возможности этого оператора.
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1230
Зарегистрирован: 15 фев 2009, 17:18

Re: return array() — как обратиться напрямую?

Сообщение wave » 28 сен 2009, 11:52

Если бы
Код: Выделить всё
$images = $query->result_array();
$out .= $this->showThumb($images[0]); 

превращался в
Код: Выделить всё
$out .= $this->showThumb( list($query->result_array()) ); 

То ещё хотя бы какой-то смысл был бы, хотя сдаётся мне, что по ресурсам вызов дополнительной функции (в таком виде это была бы функа) затратней, чем создание дополнительной переменной.

Я ведь хочу не $images вместо $images[0] передавать, а вообще обойтись без $images.
wave
 
Сообщения: 48
Зарегистрирован: 04 фев 2009, 00:32

Re: return array() — как обратиться напрямую?

Сообщение vladname » 28 сен 2009, 19:32

если я верно понял...
например, если я точно знаю, что запрос возвратит одну строку, в модели пишу return $this->db->get('table')->row(); - возвратит простой объект
далее просто echo $row->title; echo $row->name; без всяких foreach-ей
vladname
 
Сообщения: 30
Зарегистрирован: 09 дек 2008, 09:20

Re: return array() — как обратиться напрямую?

Сообщение wave » 28 сен 2009, 21:02

Ещё раз уточню вопрос. Есть код.
Код: Выделить всё
function myfunc()
{
return array('one', 'two', 'three');}

function myparamfunc($a)
{
echo $a;} 

Как мне обратиться к энному элементу массива, возвращаемого функцией, без промежуточных переменных?
Т.е., НАПРИМЕР, передать в myparamfunc() энный элемент.
Единственный рабочий вариант, который я знаю, выглядит так:
Код: Выделить всё
$temp=myfunc();
myparamfunc($temp[0]); 

Как обойтись без промежуточной $temp? Что-то типа
Код: Выделить всё
myparamfunc(myfunc()[0]); 


Вопрос получается глупейшим и не стоящим выеденного яйца, но вот поинтересовался, однако.
wave
 
Сообщения: 48
Зарегистрирован: 04 фев 2009, 00:32

Re: return array() — как обратиться напрямую?

Сообщение wave » 28 сен 2009, 21:17

P.s.
Код: Выделить всё
function myfunc()
{return array(
'one'=>'one''two''three');}

function 
myparamfunc($a)
{echo 
$a;}

$temp = (object)myfunc();

myparamfunc$temp->one ); 

Работает.

Код: Выделить всё
function myfunc()
{return array(
'one'=>'one''two''three');}

function 
myparamfunc($a)
{echo 
$a;}

myparamfunc( (object)myfunc()->one ); 

Не работает.
wave
 
Сообщения: 48
Зарегистрирован: 04 фев 2009, 00:32

Re: return array() — как обратиться напрямую?

Сообщение Tovit » 28 сен 2009, 22:28

Вы себе вообще представляете КАК php должен Вас понимать?
Вы знакомы с другими языками программирования?.....

То что хотите Вы -- не логично с точки зрения процессора (то, что php интерпретируемый, еще не значит, что он может наплевать на железо, точнее, что авторы языка будут игнорировать фундаментальные правила). Ответ, возвращаемый функцией, это не что иное как данные которые выталкиваются из стека вызовов, если их никто не принимает -- естественно они проподают. А Вы рассчитываете, что есть возможность произвести еще и адресацию по этим данным (навигацию по массиву).

Совсем другая картина при работе с объектами.
Код: Выделить всё

    
function myfunc()
    {return array(
'one'=>'one''two''three');}

    function 
myparamfunc($a)
    {echo 
$a;}

    
$temp = (object)myfunc();

    
myparamfunc$temp->one ); 
 

Работает, т.к. вы вернули массив из функции, сразу разместив его в переменной, т.е. выделили память для хранения, при этом Вы вызвали приведение типов, приведя результат к типу Объекта и все ровно -- выделили память для него.
Код: Выделить всё
function myfunc()
{return array(
'one'=>'one''two''three');}

function 
myparamfunc($a)
{echo 
$a;}

myparamfunc( (object)myfunc()->one );
 

Не работает, т.к. Вы возвращаете массив, делаете преобразование типов, но при этом не выделяете память для хранения.

Код: Выделить всё

$res 
$this->db->from('table')->where(array('id' => 2)->get(); //1) Работает

$this->db->from('table')->where(array('id' => 2)->get()->row(); //2) НЕ работает
 

1) Действия производятся над одним и тем же членом класса основного приложения, объектом db -- все логично, т.к. каждый вызов возвращает ссылку на самого себя (т.е. указатель на объект db).
2) Действия производятся так же как и в первом случае, но все ломается при попытке вызвать метод row(). Причина -- get() возвращает другой объект (не ссылку на него, а сам объект), и т.к. мы не выделяем на него память -- вызов проваливается в никуда и мы получаем ситуацию неопределенности, а следовательно, ошибку.
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1230
Зарегистрирован: 15 фев 2009, 17:18

Re: return array() — как обратиться напрямую?

Сообщение wave » 28 сен 2009, 22:48

Спасибо, примерно это я и хотел услышать. Причём, получил даже больше, чем хотел :)
wave
 
Сообщения: 48
Зарегистрирован: 04 фев 2009, 00:32

Re: return array() — как обратиться напрямую?

Сообщение michail1982 » 29 сен 2009, 00:56

а чем не устраивает
Код: Выделить всё
$row $query->first_row() или $row $query->first_row('array'
?
Аватара пользователя
michail1982
 
Сообщения: 533
Зарегистрирован: 25 ноя 2008, 15:36

Re: return array() — как обратиться напрямую?

Сообщение Tovit » 29 сен 2009, 07:47

Очень экономно расходуют память)) или промежуточные переменные очень не любят)).
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1230
Зарегистрирован: 15 фев 2009, 17:18

Re: return array() — как обратиться напрямую?

Сообщение michail1982 » 29 сен 2009, 17:30

А так не получиться? или ві название поля зарание не знаете?
Код: Выделить всё
var_dump($this->db->get('ci_sessions',array('session_id!=',1))->first_row()->session_id); 
Аватара пользователя
michail1982
 
Сообщения: 533
Зарегистрирован: 25 ноя 2008, 15:36


Вернуться в Общие вопросы по PHP и веб-программированию

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0