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?


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.


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 ...


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.


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)'; }

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.