[PHP-users 35690] 関数の戻り値を変数に格納せずに配列アクセスしたい

classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

[PHP-users 35690] 関数の戻り値を変数に格納せずに配列アクセスしたい

kobayashi-5
小林と申します。

配列を返す関数からは以下のように値を取得することができますが、

$a = foo();
$n = $a[1]; // 20 を取得できる

function foo()
{
  return array(10, 20);
}


これを配列変数 $a を介さず、
以下のように1行で書く方法はありますでしょうか?

$n = foo()[1]; // 構文エラーでした
$n = (foo())[1]; // 構文エラーでした
$n = $(foo())[1]; // 構文エラーでした


C++ や Perl 等では (構文は違えど) 上記のようなことができますが、
php でもそれができれば少しコーディングで楽ができるかな、
という程度の興味です。

--
kobayashi <[hidden email]>
_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

[PHP-users 35691] Re: 関数の戻り値を変数に格納せずに配列アクセスしたい

papa pahoo
パパぱふぅです。

PHP 5.4.0 では
 $n = foo()[1];
で正しい値を得られます。

_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

[PHP-users 35692] Re: 関数の戻り値を変数に格納せずに配列アクセスしたい

kobayashi-5
小林です。

ご返答ありがとうございます。

> PHP 5.4.0 では
>  $n = foo()[1];
> で正しい値を得られます。

すみません、php のバージョンを書いていなかったですね。
こちらの php バージョンは 5.3.3 となります。
php 5.3.3 ですと

  $n = foo()[1];

のようなコードは

  PHP Parse error:  syntax error, unexpected '[' in ***.php

というエラーになってしまいました。


php 5.4.0 をこちらでも試してみましたが、
確かにこのバージョンですと上記コードは問題なく動きました。
php 5.4.0 が使える環境ではこの書き方で行こうと思います。
(移植性はアレですが)


--
kobayashi <[hidden email]>
_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

[PHP-users 35693] Re: 関数の戻り値を変数に格納せずに配列アクセスしたい

spooky-6
In reply to this post by kobayashi-5
変数代入の場合であればlist使う方法もあります。

function foo()
{
  return array(10, 20);
}

list($n) = foo();
echo $n;
// 10

list(, $n) = foo();
echo $n;
// 20

list($n, ) = foo();
echo $;
// 10

関数から返る配列の先頭,末尾ならarray_shift,array_popも使えますね。

> On Tue, 20 Mar 2012 14:43:44 +0900
> Subject: [PHP-users 35690] 関数の戻り値を変数に格納せずに配列アクセスしたい
> kobayashi <[hidden email]> wrote (In article):
> 小林と申します。
>
> 配列を返す関数からは以下のように値を取得することができますが、
>
> $a = foo();
> $n = $a[1]; // 20 を取得できる
>
> function foo()
> {
>   return array(10, 20);
> }
>
>
> これを配列変数 $a を介さず、
> 以下のように1行で書く方法はありますでしょうか?
>
> $n = foo()[1]; // 構文エラーでした
> $n = (foo())[1]; // 構文エラーでした
> $n = $(foo())[1]; // 構文エラーでした
>
>
> C++ や Perl 等では (構文は違えど) 上記のようなことができますが、
> php でもそれができれば少しコーディングで楽ができるかな、
> という程度の興味です。
>
> --
> kobayashi <[hidden email]>
> _______________________________________________
> PHP-users mailing list  [hidden email]
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3

_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

[PHP-users 35694] Re: 関数の戻り値を変数に格納せずに配列アクセスしたい

kobayashi-5
小林です。

ご返答ありがとうございます。

> 変数代入の場合であればlist使う方法もあります。
>
> function foo()
> {
>    return array(10, 20);
> }
>
> list($n) = foo();
> echo $n;
> // 10
>
> list(, $n) = foo();
> echo $n;
> // 20
>
> list($n, ) = foo();
> echo $;
> // 10
>
> 関数から返る配列の先頭,末尾ならarray_shift,array_popも使えますね。

たしかに今回の例では list が使えますね。

ただ、欲を言うと以下のように引数に渡したりなどもしたかったです。
(後出しですみません…)

-------------------
function foo()
{
  return array(10, 20, 30, 40);
}

function foo2()
{
  $a = array();
  $a['a']['x'] = 10;
  $a['a']['y'] = 20;
  $a['b']['x'] = 30;
  return $a;
}

function bar($str)
{
  print "$str\n";
}

$a = foo();
bar(foo()[1]); // php 5.4.0 より前だとエラー
bar(foo2()['a']['y']); // php 5.4.0 より前だとエラー
-------------------

カッコの組み合わせとかで何とかならないかと思いましたが
それはどうも無理そうなので
無難に php 5.4.0 を導入(か、導入できない環境ではガマン)するのが
良いと思いました。

--
kobayashi <[hidden email]>
_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

[PHP-users 35695] Re: 関数の戻り値を変数に格納せずに配列アクセスしたい

あきら
あきらです

> bar(foo()[1]); // php 5.4.0 より前だとエラー
> bar(foo2()['a']['y']); // php 5.4.0 より前だとエラー

<?php
function foo(){
   $ret = new stdClass;
   $ret->data = array(1,2);
   return $ret;
}

var_dump( foo()->data );

クラスを使う方がすっきりはすると思います
ただしサンプルのように関数の中で使い捨てのクラスを
作るのはどんな物が返ってくるのかわからないので
あまり好ましくなくないとは思います

メンテナンスが必要なプログラムでは正しく定義した
クラスを利用することをおすすめします

あきら
_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

[PHP-users 35696] Re: 関数の戻り値を変数に格納せずに配列アクセスしたい

Mori Yojiro
In reply to this post by kobayashi-5
On Tue, 20 Mar 2012 14:43:44 +0900
kobayashi <[hidden email]> wrote:

> これを配列変数 $a を介さず、
> 以下のように1行で書く方法はありますでしょうか?
素直に配列で受けるべきだと思いますが、配列を使わない理由は何ですか?

/* 森 洋二郎(Mori Yojiro)      */
/* Booby Trap Systems          */
/* [hidden email]    */
/* http://www.boobytrap.ne.jp/ */

_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

[PHP-users 35699] Re: 関数の戻り値を変数に格納せずに配列アクセスしたい

kobayashi-5
小林です。

ご返答ありがとうございます。

> 素直に配列で受けるべきだと思いますが、配列を使わない理由は何ですか?

最初に書いた
>> C++ や Perl 等では (構文は違えど) 上記のようなことができますが、
>> php でもそれができれば少しコーディングで楽ができるかな、
>> という程度の興味です。
これだけの理由に過ぎません。

例えばこういうことができたら楽だと思いませんか?
(そして php 5.4.0 ではそれができるので気に入りました)

  $path = '/abc/def/ghi.xyz';
  foo( pathinfo($path)['basename'] );

#basenameを使えという指摘は論点から外れるのでご勘弁を…

--
kobayashi <[hidden email]>
_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

[PHP-users 35700] Re: 関数の戻り値を変数に格納せずに配列アクセスしたい

kobayashi-5
In reply to this post by あきら
小林です。

ご返答ありがとうございます。

> <?php
> function foo(){
>     $ret = new stdClass;
>     $ret->data = array(1,2);
>     return $ret;
> }
>
> var_dump( foo()->data );

なるほど、メンバ変数を噛ませる発想はありませんでした。
これだと
  bar( foo()->data[1] );
みたいな使い方もできますね。

今回は関数の内部実装は変えずにコールする側での利用方法を
工夫したかったのですが、これも面白い方法なので覚えておきます。

--
kobayashi <[hidden email]>
_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3