機能的なPHPを使用した不変のアレイ更新の芸術
PHPで不変の配列更新を実現するには、元の配列を変更する代わりに新しい配列を作成することで実行する必要があります。 1.配列要素を直接変更しないでください。 array_merge()を使用するか、手動でコピーして新しい配列を生成する必要があります。 2。array_merge()を使用して簡潔な不変の更新を実行し、元の配列を変更せずに保持し、新しいキーの追加をサポートします。 3.ネストされた配列の再帰的setin()などの純粋な関数を使用して、深い構造が更新されたときに副作用がないことを確認します。 4. Array_MapやArray_Filterなどの機能ツールを組み合わせて、副作用なしに副作用を実現します。 5.入力配列を読み取り専用として扱う、新しい配列を返す、PHP 8.2 ReadonlyクラスまたはPHP 8.2のDTOを使用してデータをカプセル化するなど、コンベンションを通じて不変性を強化します。このアプローチは、コードの予測可能性、保守性、テスト可能性を改善し、最終的にはより安全な国家管理を達成します。
PHPの不変の配列の更新は、HaskellやELMなどの機能的なプログラミング言語から借りた概念のように聞こえるかもしれませんが、特に機能パターンをサポートする機能で言語が成熟するにつれて、PHPでも同じ原則を効果的に適用できます。

コアのアイデアはシンプルです。配列を所定の位置に変更する代わりに、目的の変更を含む新しい配列を作成し、元のアレイを作成します。これにより、より予測可能なコード、デバッグが容易、副作用が少なくなります。特に、より大きなアプリケーションや、機能スタイルで州を操作する場合には価値があります。
機能的手法を使用して、PHPで不変のアレイ更新を習得する方法は次のとおりです。

1.配列の変更を避けてください
従来のPHPでは、次のようなことをするかもしれません。
$ user = ['name' => 'alice'、 'age' => 30]; $ user ['age'] = 31; //突然変異!
これにより、元の配列が変異します。代わりに、新しいバージョンを作成します。

$ user = ['name' => 'alice'、 'age' => 30]; $ newuser = ['name' => $ user ['name']、 'age' => $ user ['age'] 1];
現在、 $user
変更されておらず、 $newUser
更新を反映しています。
しかし、キーを手動でコピーすると退屈になります。のスプレッドのような動作を使用します
またはarray_merge()
。
2。クリーンな不変のアップデートには、 array_merge()
を使用します
array_merge()
は、更新されたコピーを作成するための頼りになるツールです。
$ user = ['name' => 'alice'、 'age' => 30]; $ updatedUser = array_merge($ user、['age' => 31]);
これにより、新しい配列が返されます。元の$user
は触れられません。
新しいキーを追加することもできます。
$ extendedUser = array_merge($ user、['Active' => true]);
重要: array_merge()
再帰的に処理されない限り、複雑なネストされた構造ではなく、インデックス付きまたは関連する配列で合理的に機能します。
3.純粋な関数でネストされた更新を処理します
ネストされたアレイの場合、不変性にはより深い注意が必要です。これをしないでください:
$ data ['user'] ['profile'] ['theme'] = 'dark'; //突然変異!
代わりに、純粋な関数を構築して新しい構造を返します。
function withupdatedTheme(配列$ data、string $ theme):array { return array_merge($ data、[ 'user' => array_merge($ data ['user']、[ 'profile' => array_merge($ data ['user'] ['profile']、[ 「テーマ」=> $テーマ ])) ])) ]); }
使用法:
$ newData = with withUpdatedTheme($ data、 'dark');
現在、 $data
が保存されており、変更は再利用可能なテスト可能な機能でカプセル化されています。
深くネストされたデータについては、一般的なsetIn()
関数を書くことを検討してください。
function setin(array $ array、array $ path、$ value):array { $ result = $ array; $ cursor =&$ result; foreach($ path as $ key){ if(!is_array($ cursor)){ $ cursor = []; } $ cursor =&$ cursor [$ key]; } $ cursor = $ value; $ resultを返します。 }
待ってください - これは参照を使用し、 $result
を変更します。純粋ではありません。
これが本当に不変のバージョンです:
function setin(array $ array、array $ path、$ value):array { if(empty($ path)){ $ arrayを返します。 } $ key = array_shift($ path); if(!empty($ path)){ $ nested = $ array [$ key] ?? []; if(!is_array($ nested)){ $ nested = []; } $ array [$ key] = setin($ nested、$ path、$ value); } それ以外 { $ array [$ key] = $ value; } $ arrayを返します。 }
今、あなたはできます:
$ newData = setin($ data、['user'、 'profile'、 'theme']、 'dark');
また、 $data
変更されていません。
4.機能的なヘルパーと組み合わせます
このスタイルをより表現力豊かにするために、機能的なヘルパーと不変の更新を組み合わせてください。
たとえば、突然変異のないアレイ上にマップします。
$ users = [['name' => 'alice'、 'age' => 30]、['name' => 'bob'、 'age' => 25]]; $ usersagedup = array_map( fn($ user)=> array_merge($ user、['age' => $ user ['age'] 1])、 $ユーザー );
またはフィルター:
$ ActiveUsers = array_filter($ users、fn($ user)=> $ user ['Active'] ?? false);
これらは、元の$users
アレイを変更しません。
5.慣習により不変性を受け入れる
PHPは不変性を強制しないため、規律は重要です。ヒント:
- 関数に渡されたアレイを読み取り専用として渡します。
- 入力を変更する代わりに新しい配列を返します。
- データ構造をモデリングするときは、
readonly
クラス(PHP 8.2)を使用します。 - 複雑なデータに値オブジェクトまたはDTOを使用することを検討してください。
readonlyクラスの例:
readonlyクラスユーザー { パブリック関数__construct( public string $ name、 Public Int $ age ){} } function with withageincreaded(user $ user、int $ by = 1):user { 新しいユーザー($ user-> name、$ user-> age $ by); }
これで、オブジェクトレベルで不変性が強制されます。
PHPの不変の配列の更新は自動ではありませんが、 array_merge()
、純粋な関数、および機能的思考を使用すると、より安全でメンテナンスされたコードを記述できます。それはすべてをコピーすることではなく、制御、明確さ、意図しない結果を避けることです。
基本的に、データを変更できないかのようにデータを扱うと、より良いPHPを書きます。
以上が機能的なPHPを使用した不変のアレイ更新の芸術の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

array_merge()を使用して、2番目の配列の値を上書きして元の配列を更新します。 2。ユニオンオペレーター()を使用して元の配列値を保持し、欠落しているキーのみを追加します(デフォルト値の設定に適しています)。 3。非ヌル値のみを更新するなど、条件と組み合わせたforeachを通じて、細粒の制御を実現できます。 4。ネストされた配列の場合、array_replace_recursive()を使用して、深い更新を実現する必要があります。 5.更新する場合、array_key_exists()またはsisset()を使用して、エラーを避けるためにキーの存在を安全にチェックする必要があります。これらのメソッドは、PHPの別の配列に基づいて配列を更新する主なシナリオをカバーしており、操作を確保するためにデータ構造とロジックに従って適切な方法を選択する必要があります

tooptimizelarge-scalearrayupdates:1。mutatearraysinsteadof cleaTingsingsussursursursuradorcatoreducememoryusage;

Array_walkは、配列要素を設置するためのPHPの強力な機能です。キー名、ネストされた構造、または外部状態に基づいて複雑な変換が必要なシナリオに適しています。 1.リファレンスに配列と要素を渡し、元の配列を直接変更します。 2。コールバック関数は、キーと値にアクセスし、3番目のパラメーターの通過コンテキストをサポートできます。 3.再帰と組み合わせて多次元配列を処理できます。 4.オブジェクトプロパティのバッチ変更に適しています。 5.新しい配列は返さず、そのパフォーマンスはarray_mapよりも優れていますが、元の配列を保持する必要があるシナリオには適していません。正しく使用すると、効率的に実行され、コンテキストに敏感または再帰的なデータ変換を処理する際にクリーンなコードがあります。

userCursiveFunctionStoSafelyTraversENDUPDATENESTEDARRAYSWITHUNTUNDEPTHBYCREATINGMISSINGKEYSASNEEDED.2.LEVERAGEARRAREREFERENCES WITHTHETHETHESTHESTHESTHESTHESTHESTHESWITHTHESWITHTHESWITHITHINEREMENTSWITHTRIGTRIGTRIGTRIGTRIGRINGDEPTRAVERSAL.3.IMPPREMENTDOTN

DynamicArraySallowRuntimeModificationsByAddingOrupDingingElements、BestPracticesEnsuringEnsuring andSafety.1)UsePush/AppendToAddementsATTHEENDFOROPTIMALFORMANCE.2)

PHPでの不変のアレイの更新を実現するには、元の配列を変更する代わりに新しい配列を作成することで実行する必要があります。 1.配列要素を直接変更しないでください。 array_merge()を使用するか、手動でコピーして新しい配列を生成する必要があります。 2。array_merge()を使用して簡潔な不変の更新を実行し、元の配列を変更せずに保持し、新しいキーの追加をサポートします。 3.ネストされた配列の再帰的setin()などの純粋な関数を使用して、深い構造が更新されたときに副作用がないことを確認します。 4。副作用なしにデータ処理を実現するために、array_mapやarray_filterなどの機能ツールと組み合わせて。 5.入力配列を読み取り専用として扱う、新しい配列を返す、PHP8.2でReadoを使用するなど、コンベンションを通じて不変性を強化する

ArraysofobjectsinphpContainClassInstances、avaindirectPropertyORMethodベースモディフィクション

PHPリファレンスを使用して、アレイの現場更新を実現し、コピーオーバーヘッドを回避し、パフォーマンスを向上させます。 1.変数が同じデータを指すように参照を作成し、修正が元の配列に反映されるようにする。 2.ネストされた配列を処理する場合、&&cを介して深い要素の参照を取得し、再割り当てすることなく直接変更します。 3. foreachループで&$ itemを使用して元の配列要素を変更しますが、その後の副作用を防ぐために、ループの後に解明されていない($ item)は解除されなければなりません。 4.構成管理やその他のシナリオに適した動的パスを介して深い参照を返す関数を記述できます。 5.参照は効率的ですが、過剰complexコードを避けるために注意して使用する必要があります。必要に応じてロジックが明確であり、コメントが追加されていることを確認してください。参照を正しく使用すると、大規模なサイズを大幅に最適化できます
