Array de acesso retornado por uma função em php

88

Estou usando um mecanismo de modelo que insere código no meu site onde eu quero.

Eu escrevi uma função para testar algo que é bastante fácil:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

O problema é que $ this-> data é privado e não consigo acessá-lo em todos os lugares, então preciso usar getData (); o que causa o meu problema.

$this->getData()['a']['b']

não funciona, e atribuir o valor primeiro também não porque ele será usado diretamente em um bloco if ().

Alguma ideia?

enyo
fonte
Atribuir o valor de retorno definitivamente funciona e é a única maneira. Você pode nos mostrar o seu código que não funciona?
Anti Veeranna de
Bem, isso não funciona porque o código será inserido em um if (/ * código aqui * /). Portanto, não posso simplesmente atribuir os dados antes.
enyo,
1
O que diabos você está construindo? :) algo com eval?
Anti Veeranna de
O que você está tentando verificar? Você tenta ver se o elemento da matriz existe e tem um valor não vazio? Você pode usar a função 'vazio' para isso. Esta questão precisa de mais clareza!
txwikinger
Como é (foi) o valor da string que você retornou myfunction()processado posteriormente? Essa parte está faltando na sua pergunta.
hakre

Respostas:

134

Desde o PHP 5.4 é possível fazer exatamente isso:

getSomeArray()[2]

Referência: https://secure.php.net/manual/en/language.types.array.php#example-62

No PHP 5.3 ou anterior, você precisará usar uma variável temporária.

enyo
fonte
4
Eu tenho PHP 5.4.11-1~precise+1e esse recurso não funciona! Recebi mensagem em respostaParse error: syntax error, unexpected '['
Eugene
1
+ Eugene, você conseguiu fazer funcionar? Talvez outros tenham o mesmo problema.
enyo
2
Demorou até o php 5.4 para suportar a notação de array retornada de funções ?! Que bug desagradável.
Basil Musa
E então você tenta obter o primeiro elemento de uma matriz gerada por array_filter e começa a chorar
Loupax
17

Você não pode usar algo assim:

$this->getData()['a']['b']

isto é, a sintaxe de acesso à matriz não é possível diretamente em uma chamada de função.

Você deve usar alguma variável temporária , como esta:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

No seu caso, isso provavelmente significa usar algo assim:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

Voce tem que :

  • primeiro, chame seu getData()método e armazene seu valor de retorno em um varibale temporário
  • então, use essa variável temporária para o seu teste

Você não tem muita escolha sobre isso, na verdade ...

Pascal MARTIN
fonte
Bem, como eu disse, meu problema é que este código é inserido, diretamente em if (/ * o código vai aqui * /) então definir uma função não é realmente possível ...
enyo
Você não pode atribuir o resultado da chamada do método a uma variável antes da instrução if e usar essa variável na instrução if, em vez de tentar chamar diretamente o método da instrução if?
Pascal MARTIN
1
Infelizmente não ... Este é um motor de templates, e não tenho controle sobre ele.
enyo,
12

Ok ... aparentemente não tem jeito melhor mesmo, então vou me responder com uma solução não tão bonita:

Eu criei a função:

arrayGet($array, $index) { return $array[$index]; }

E usei assim:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

Isso não é bonito, mas funciona.

enyo
fonte
1

$this->dataestá sempre acessível, se estiver protegido. não é acessível de qualquer lugar, então se você estiver voltando$object->data$this em seu código e ele é avaliado como tal, deve estar ok.

Aliás, há um bug em seu código: as aspas precisam ser escapadas.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
soulmerge
fonte
Sim, desculpe ... Eu corrigi minha postagem: $ this-> data is private, claro. Também corrigiu meu erro de digitação ao criar o bug.
enyo,
1

É possível a partir do PHP versão 5.4.

Se você não quiser uma variável temporária para isso e sua versão do PHP for menor que 5.4 , você ainda pode usar algumas funções integradas para obter o primeiro ou o último elemento:

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

Editar: !!! Por favor, note que em versões posteriores (5.4+) o PHP irá lançar um aviso, porque end só espera variáveis ​​como parâmetro.

Lajos Meszaros
fonte