Чтобы решить вопрос, вам нужно добавить Rank() OVER ( ORDER BY cvrnummer,virksomhednavn,newid()) AS rankrow
. Это позволит отсортировать список по запросу
.PHP не может получить доступ к результатам массива из функции. Некоторые люди называют это проблемой, некоторые просто принимают это как то, как разработан язык. Поэтому PHP заставляет вас создавать необязательные переменные просто для извлечения нужных вам данных.
Так что вам нужно сделать.
$var = foobar();
print($var[0]);
Ну, вы можете использовать любое из следующих решений, в зависимости от ситуации:
function foo() {
return array("foo","bar","foobar","barfoo","tofu");
}
echo(array_shift(foo())); // prints "foo"
echo(array_pop(foo())); // prints "tofu"
Или вы можете получить конкретные значения из возвращенного массива с использованием list () :
list($foo, $bar) = foo();
echo($foo); // prints "foo"
echo($bar); // print "bar"
Редактировать: пример кода для each () , который я дал ранее, был неверным. each () возвращает пару ключ-значение. Так что было бы проще использовать foreach () :
foreach(foo() as $key=>$val) {
echo($val);
}
Напишите функцию-оболочку, которая будет выполнять то же самое. Из-за простого преобразования типов в PHP это может быть довольно неограниченно:
function array_value ($array, $key) {
return $array[$key];
}
Как уже упоминалось, это невозможно. Синтаксис PHP этого не позволяет. Однако у меня есть одно предложение, которое решает проблему с другой стороны.
Если вы контролируете метод getBarArray
и имеете доступ к стандартной библиотеке PHP (установленной на многих PHP 5.2. X и установлен по умолчанию вместе с PHP 5.3) вам следует рассмотреть возможность возврата ArrayObject
вместо собственного массива / коллекции PHP. ArrayObjects
имеет метод offetGet
, который можно использовать для получения любого индекса, поэтому ваш код может выглядеть примерно как
<?php
class Example {
function getBarArray() {
$array = new ArrayObject();
$array[] = 'uno';
$array->append('dos');
$array->append('tres');
return $array;
}
}
$foo = new Example();
$value = $foo->getBarArray()->offsetGet(2);
. И если вам когда-нибудь понадобится собственный массив / коллекция, вы можете всегда приводите результаты.
//if you need
$array = (array) $foo->getBarArray();
К сожалению, нет способа сделать это, хотя он есть в большинстве других языков программирования.
Если вы действительно хотите сделать однострочник, вы можете создать функцию, называемую () и выполните что-то вроде
$test = a(func(), 1); // second parameter is the key.
. Но в остальном func () [1] не поддерживается в PHP.
Разыменовывание массива возможно начиная с PHP 5.4:
function foo() {
return array(1, 2, 3);
}
echo foo()[2]; // prints 3
с PHP 5.3 вы получите
Parse error: syntax error, unexpected '[', expecting ',' or ';'
Исходный ответ:
Это было запрошено уже до . Ответ - нет. Это невозможно.
На процитируйте Энди Гутманс по этой теме:
Это хорошо известный запрос функции но не будет поддерживаться в PHP 5.0. я не могу сказать тебе, будет ли это когда-нибудь поддерживается. Требуются некоторые исследования и много размышлений.
Вы также можете найти этот запрос несколько раз в PHP Bugtracker. Для получения технических подробностей я предлагаю вам ознакомиться с официальным RFC и / или спросить на Внутренние компоненты PHP .
Это работает?
return ($foo->getBarArray())[0];
В противном случае вы можете опубликовать функцию getBarArray ()? Я не понимаю, почему это не сработает из того, что вы опубликовали до сих пор.
Это слишком надумано, но если вам действительно НУЖНО, чтобы это было в одной строке:
return index0( $foo->getBarArray() );
/* ... */
function index0( $some_array )
{
return $some_array[0];
}
Если вы просто хотите вернуть первый элемент в массиве, используйте функцию current ().
return current($foo->getBarArray());
На самом деле я написал библиотеку, которая допускает такое поведение:
http://code.google.com/p/php-preparser/
Работает со всем: функциями , методы. Кеширует, поэтому работает так же быстро, как и сам PHP :)
Если это просто эстетика, то нотация Object будет работать, если вы вернете объект. Что касается управления памятью, то временная копия не создается, только изменение ссылки.
После дальнейшего исследования я считаю, что ответ отрицательный, такая временная переменная действительно является каноническим способом работы с массивом, возвращаемым функцией.
Похоже, это изменится, начиная с PHP 5.4.
Кроме того, этот ответ изначально был для этой версии вопроса:
Как избежать временных переменных в PHP при использовании массива, возвращаемого функцией
Вы, конечно, можете вернуть объект вместо массива и получить к нему доступ следующим образом:
echo "This should be 2: " . test()->b ."\n";
Но я не нашел возможности сделать это с массивом: (
Мой обычный обходной путь состоит в том, чтобы иметь общую функцию, подобную этой
function e($a, $key, $def = null) { return isset($a[$key]) ? $a[$key] : $def; }
, а затем
echo e(someFunc(), 'key');
в качестве бонуса, это также позволяет избежать предупреждения «неопределенный индекс», когда оно вам не нужно.
Что касается причин, по которым foo () [x]
не работает, то ответ весьма невежлив и не будет здесь публиковаться. ;)
Вы можете использовать ссылки:
$ref =& myFunc();
echo $ref['foo'];
Таким образом, вы на самом деле не создаете дубликат возвращенного массива.
Вот несколько способов решения вашей проблемы.
Во-первых, вы можете использовать для непосредственного именования переменных, если вы возвращаете массив переменных, которые не являются частью коллекции, но каждая имеет отдельное значение.
Два других способа - вернуть результат, представляющий собой набор значений.
function test() {
return array(1, 2);
}
list($a, $b) = test();
echo "This should be 2: $b\n";
function test2() {
return new ArrayObject(array('a' => 1, 'b' => 2), ArrayObject::ARRAY_AS_PROPS);
}
$tmp2 = test2();
echo "This should be 2: $tmp2->b\n";
function test3() {
return (object) array('a' => 1, 'b' => 2);
}
$tmp3 = test3();
echo "This should be 2: $tmp3->b\n";
Вы не можете связать такие выражения в PHP, поэтому вам придется сохранить результат array_test ()
в Переменная.
Попробуйте следующее:
function array_test() {
return array(0, 1, 2);
}
$array = array_test();
echo $array[0];