目次
回复内容:
ホームページ バックエンド開発 PHPチュートリアル closure - 求指导:php闭包实现数组的格式化

closure - 求指导:php闭包实现数组的格式化

Jun 06, 2016 pm 08:44 PM
php 閉鎖

我原本的意思是如下代码

<code>                $eData=array(
                'section'=>$v['section'],
                'page'=>$v['page'],
                //'status'=>$v['status'],
                'type'=>$v['type'],
            );

                    unset($v['page']);
                    //unset($v['status']);
                    unset($v['id']);
                    unset($v['type']);
                    unset($v['section']);
            $eData['data']=serialize($v);
</code>
ログイン後にコピー

使用闭包的方式

<code>                $eData=array(
                'section'=>$v['section'],
                'page'=>$v['page'],
                //'status'=>$v['status'],
                'type'=>$v['type'],
                'data'=>function(){
                    unset($v['page']);
                    //unset($v['status']);
                    unset($v['id']);
                    unset($v['type']);
                    unset($v['section']);
            return serialize($v);
                    }
            );
</code>
ログイン後にコピー

问题 1、php的闭包类closure 并不支持返回参数
问题 2、使用了use方法后仍然不能够对$v进行格式化操作,只能够删除其中的元素
use 方法

$eData=array( 'section'=>$v['section'],   
'page'=>$v['page'], 
//'status'=>$v['status'], 
'type'=>$v['type'], 
'data'=>function() use($v){ 
unset($v['page']);
 //unset($v['status']);
 unset($v['id']); 
unset($v['type']);
 unset($v['section']);                                          
return $v=serialize($v);
}, );
ログイン後にコピー
ログイン後にコピー

回复内容:

我原本的意思是如下代码

<code>                $eData=array(
                'section'=>$v['section'],
                'page'=>$v['page'],
                //'status'=>$v['status'],
                'type'=>$v['type'],
            );

                    unset($v['page']);
                    //unset($v['status']);
                    unset($v['id']);
                    unset($v['type']);
                    unset($v['section']);
            $eData['data']=serialize($v);
</code>
ログイン後にコピー

使用闭包的方式

<code>                $eData=array(
                'section'=>$v['section'],
                'page'=>$v['page'],
                //'status'=>$v['status'],
                'type'=>$v['type'],
                'data'=>function(){
                    unset($v['page']);
                    //unset($v['status']);
                    unset($v['id']);
                    unset($v['type']);
                    unset($v['section']);
            return serialize($v);
                    }
            );
</code>
ログイン後にコピー

问题 1、php的闭包类closure 并不支持返回参数
问题 2、使用了use方法后仍然不能够对$v进行格式化操作,只能够删除其中的元素
use 方法

$eData=array( 'section'=>$v['section'],   
'page'=>$v['page'], 
//'status'=>$v['status'], 
'type'=>$v['type'], 
'data'=>function() use($v){ 
unset($v['page']);
 //unset($v['status']);
 unset($v['id']); 
unset($v['type']);
 unset($v['section']);                                          
return $v=serialize($v);
}, );
ログイン後にコピー
ログイン後にコピー

是要这个效果吗?

$eData = array(
    'section' => $v['section'],
    'page'    => $v['page'],
    'type'    => $v['type'],
    'data'    => call_user_func(
        function() use (&$v)
        {
            unset($v['page']);
            unset($v['id']);
            unset($v['type']);
            unset($v['section']);
            return serialize($v);
        }
    ),
);
ログイン後にコピー

大致看了一下,你应该想让 'data'是serialize($v)吧?也就是将'section','page','type'去除后后序列化的字符串吧。'data'=>function() 是将匿名函数赋给了data.不是将返回值赋给data。
第二个问题太傻叉了

'data'=>function() use($v){ 
unset($v['page']);
 //unset($v['status']);
 unset($v['id']); 
unset($v['type']);
 unset($v['section']);                                          
return $v=serialize($v)
ログイン後にコピー

使用use语法传递的是重新复制了一份传递,又不是引用,要想将$v变成序列化后的值就应该是引用use(&$v)

人家二楼说的是对的,凭什么不给人家采纳?

你那样是将一个匿名函数传给$eData['data']了,并没有把函数的返回结果给它。

不知道题主说的用闭包是怎样的情况。
就根据自己理解来回答下好了。

类似下面这样写:

<code>class A {

    var $eData = Array();

    function formatArrayWithHookFn( $hookFn ) {
        $hookFn( $this->$eData );
    }

}

$a = new A();
$a->formatArrayWithHookFn(function( $arrayToFormat ) {
    $arrayToFormat['foo'] = 'bar';
    // ...
});
</code>
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles