Pergunta

No php, muitas vezes preciso mapear uma variável usando um array...mas não consigo fazer isso de uma só vez.cf.exemplo:

// the following results in an error:
echo array('a','b','c')[$key];

// this works, using an unnecessary variable:
$variable = array('a','b','c');
echo $variable[$key];

Este é um problema menor, mas continua incomodando de vez em quando ...Não gosto do fato de usar uma variável para nada;)

Foi útil?

Solução

Eu não me preocuparia com essa variável extra, na verdade.Se desejar, você também pode removê-lo da memória depois de usá-lo:

$variable = array('a','b','c');
echo $variable[$key];
unset($variable);

Ou você pode escrever uma pequena função:

function indexonce(&$ar, $index) {
  return $ar[$index];
}

e chame isso com:

$something = indexonce(array('a', 'b', 'c'), 2);

A matriz deve ser destruída automaticamente agora.

Outras dicas

A resposta técnica é que o Gramática da linguagem PHP só permite notação de subscrito no final de expressões variáveis e não expressões em geral, é assim que funciona na maioria dos outros idiomas.Sempre considerei isso uma deficiência da linguagem, pois é possível ter uma gramática que resolva subscritos de qualquer expressão de forma inequívoca.Pode ser que eles estejam usando um gerador de analisador inflexível ou simplesmente não queiram quebrar algum tipo de compatibilidade com versões anteriores.

Aqui estão mais alguns exemplos de subscritos inválidos em expressões válidas:

$x = array(1,2,3);
print ($x)[1]; //illegal, on a parenthetical expression, not a variable exp.

function ret($foo) { return $foo; }
echo ret($x)[1]; // illegal, on a call expression, not a variable exp.

Isso é chamado de desreferenciação de array.Foi adicionado no php 5.4.http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

atualização[25/11/2012]: a partir do PHP 5.5, a desreferenciação foi adicionada a contants/strings, bem como a arrays

Isso pode não estar diretamente relacionado.Mas vim para este post procurando uma solução para esse problema específico.

Obtive o resultado de uma função no seguinte formato.

Array
(
    [School] => Array
            (
                [parent_id] => 9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a
            )
)

o que eu queria era o valor parent_id "9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a".Usei a função assim e consegui.

array_pop( array_pop( the_function_which_returned_the_above_array() ) )

Então, foi feito em uma linha :) Espero que seja útil para alguém.

function doSomething()
{
    return $somearray;
}

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();

na verdade, existe uma solução elegante :) O seguinte irá atribuir o terceiro elemento do array retornado por myfunc a $myvar:

$myvar = array_shift(array_splice(myfunc(),2));

Ou algo assim, se você precisar do valor do array em uma variável

$variable = array('a','b','c');
$variable = $variable[$key];

Existem vários oneliners você poderia inventar, usando php variedade_* funções.Mas garanto que fazer isso é totalmente redundante comparar o que você deseja alcançar.

Exemplo, você pode usar algo como o seguinte, mas não é uma solução elegante e não tenho certeza sobre o desempenho disso;

   array_pop ( array_filter( array_returning_func(), function($key){    return $key=="array_index_you_want"? TRUE:FALSE;    },ARRAY_FILTER_USE_KEY ) );

se você estiver usando uma estrutura php e estiver preso a uma versão mais antiga do php, a maioria das estruturas possui bibliotecas de ajuda.

exemplo:Ajudantes de matriz Codeigniter

embora o fato de a desreferenciação ter sido adicionada no PHP >=5.4 você poderia ter feito isso em uma linha usando o operador ternário:

echo $var=($var=array(0,1,2,3))?$var[3]:false;

dessa forma você não mantém o array apenas a variável.e você não precisa de funções extras para fazer isso... Se esta linha for usada em uma função, ela será automaticamente destruída no final, mas você também pode destruí-la como dito em unset posteriormente no código, se não for usado em uma função.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top