PHPの関数によって返される配列にアクセスする


88

私は自分のサイトにコードを挿入するテンプレートエンジンを使用しています。

私は非常に簡単なものをテストするための関数を書きました:

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

問題は、$ this-> dataはプライベートであり、どこからでもアクセスできないため、getData();を使用する必要があることです。これが私の問題の原因です。

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

if()ブロックで直接使用されるため、機能せず、最初に値を割り当てることもできません。

何か案は?


戻り値の割り当ては確実に機能し、唯一の方法です。機能していないコードを見せていただけますか?
Anti Veeranna 2009

まあ、コードはif(/ * code here * /)に挿入されるので機能しません。そのため、以前にデータを割り当てることはできません。
enyo 2009

1
とにかく、一体何を構築していますか?:) eval付きの何か?
Anti Veeranna 09/09/22

何をチェックしようとしていますか?配列要素が存在し、空でない値があるかどうかを確認しようとしていますか?これには 'empty'関数を使用できます。この質問はもっと明確にする必要があります!
txwikinger 09/09/22

返されたその文字列値はどのようにmyfunction()処理されましたか?あなたの質問にはその部分が欠けています。
hakre 2013

回答:


134

PHP 5.4以降、正確にそれを行うことが可能です:

getSomeArray()[2]

リファレンス:https : //secure.php.net/manual/en/language.types.array.php#example-62

PHP 5.3以前では、一時変数を使用する必要があります。


4
私は持っていますがPHP 5.4.11-1~precise+1、この機能は動作しません!メッセージParse error: syntax error, unexpected '['
ユージーン

1
+ユージンはそれを機能させましたか?多分他の人が同じ問題を経験します。
enyo 2013年

2
関数から返される配列表記をサポートするのにphp 5.4までかかりましたか?なんて厄介なバグでしょう。
バジルムーサ

次に、array_filterによって生成された配列の最初の要素を取得して泣き始めます
Loupax

17

次のようなものは使用できません。

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

つまり、配列アクセス構文は、関数呼び出しでは直接実行できません。

次のような一時変数を使用する必要があります。

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

あなたの場合、これはおそらく次のようなものを使用することを意味します:

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

必ず :

  • まず、getData()メソッドを呼び出し、その戻り値を一時的な変数に保存します
  • 次に、その一時変数をテストに使用します

あなたはそれについてあまり選択肢がありません、実際には...


さて、私が言ったように、私の問題は、このコードがif(/ *コードがここに入る* /)に直接挿入されるため、関数を定義することは実際には不可能です...
enyo

メソッド呼び出しの結果をifステートメントの前の変数に割り当て、ifステートメントから直接メソッドを呼び出そうとせずに、その変数をifステートメントで使用できませんか?
Pascal MARTIN

1
残念ながらありません...これはテンプレートエンジンであり、私はそれを制御できません。
enyo 2009

12

わかりました...どうやらこれほど良い方法はないので、それほど美しくはない解決策で自分自身に答えます。

私は関数を作成しました:

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

そして、それを次のように使用しました:

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

これはきれいではありませんが動作します。


1

$this->data保護されている場合は、常にアクセス可能です。どこからでもアクセスできるわけではないので、コードで戻ってきて、そのように評価されている場合は問題ありません。$object->data$this

ところで、コードにバグがあります。引用符はエスケープする必要があります。

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

申し訳ありません...私は私の投稿を修正しました:$ this-> dataはもちろん非公開です。また、バグを作成するときに私のタイプミスを修正しました。
enyo 2009

1

PHPバージョン5.4以降で可能です。

そのための一時変数が不要で、PHPバージョンが5.4よりも小さい場合でも、いくつかの組み込み関数を使用して最初または最後の要素を取得できます。

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

編集: !!! endはパラメータとして変数のみを想定しているため、新しいバージョン(5.4以降)ではPHPが通知をスローすることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.