ホームページ バックエンド開発 PHPチュートリアル PHP_PHP チュートリアルでの配列の走査の高度な操作の詳細な説明

PHP_PHP チュートリアルでの配列の走査の高度な操作の詳細な説明

Jul 13, 2016 am 10:47 AM
foreach list php 一般的に 存在する 操作する データ 配列 詳しい説明 トラバース 高度な

PHP でデータを走査するときは、list、foreach、および each が一般的に使用されますが、次のチュートリアルでは使用されない場合があります。この方法が皆さんの役に立つことを願っています。 。

プログラミング言語を学習するときは、必ず for を学習し、while を使用して for の効果を書くなどの演習を行ってください。

foreach が存在しない前に、foreach の関数を作成する方法を見てみましょう (達成するには while、list、および each を使用します)。

この記事を参照してください: PHP の前身となる foreach の書き方

コードは次のとおりですコードをコピー
//古い書き方

リセット($attributes);
while (list($key, $value) = each($attributes)) {
//何かをしてください
}

//PHP4の新バージョン

foreach ($attributes as $key => $value){
//何かをしてください
}

多次元連想配列のソート

PHP は、sort()、ksort()、asort() などの配列ソート関数をいくつか提供しますが、多次元連想配列のソートは提供しません。

たとえば、次のような配列:

コードは次のとおりですコードをコピー 配列を昇順に並べ替えるには、価格を比較する関数を自分で作成し、その関数をコールバック関数として usort() 関数に渡してこの関数を実装する必要があります。
配列

(
[0] => 配列
(
[名前] =>チェス
[価格] => 12.99
)

[1] => 配列

(
[名前] =>チェッカーズ
[価格] => 9.99
)

[2] => 配列

(
[名前] => バックギャモン
[価格] => 29.99
)
)

コードは次のとおりですコードをコピー関数comparePrice($priceA, $priceB){ $priceA['価格'] - $priceB['価格'];
を返します }


usort($games, 'comparePrice'); このプログラム フラグメントを実行すると、配列がソートされ、結果は次のようになります。
配列

(

[0] => 配列

(

[名前] =>チェッカーズ
[価格] => 9.99
)

[1] => 配列
(
[名前] =>チェス

[価格] => 12.99

)

[2] => 配列
(
[名前] => バックギャモン

[価格] => 29.99

)
)



配列を降順に並べ替えるには、comparePrice() 関数で 2 つの減算された数値の位置を交換するだけです。

逆の順序で配列を走査します
PHP の While ループと For ループは、配列を走査する最も一般的な方法です。しかし、以下のような配列をどのように反復処理するのでしょうか?

PHP 標準ライブラリには、コレクション用のイテレータ クラスがあり、これは、いくつかの異種データ構造 (ファイル システムやデータベース クエリ結果セットなど) を走査するために使用できるだけでなく、未知のネストされた配列を反復するためにも使用できます。サイズ。たとえば、上記の配列を走査するには、RecursiveArrayIterator イテレータを使用できます。
コードは次のとおりです コードをコピー

配列
(
[0] => 配列
(
[名前] => ボード
[ゲーム] => 配列
(
[0] => 配列
(
[名前] = & gt; [価格] = > 12.99
)

[1] => 配列

(
[名前] = & gt; [価格] = >9.99
)
)
)
)

コードは次のとおりですコードをコピー$iterator = 新しい RecursiveArrayIterator($games); iterator_apply($iterator, 'navigateArray', array($iterator)); 名前:チェス 価格: 12.99
関数 navigateArray($iterator) {

while ($iterator->valid()) {
if ($iterator->hasChildren()) {

NavigateArray($iterator->getChildren()); } その他 {

Printf("%s: %s", $iterator->key(), $iterator->current());
}
$iterator->next(); }
}




このコードを実行すると、次の結果が得られます:

名前: ボード
名前:チェッカーズ

価格: 9.99

連想配列の結果をフィルタリングする
次の配列が与えられたが、価格が $11.99 未満の要素のみを操作したいとします。


コードは次のとおりです


コードをコピー

配列 [0] => 配列 ( [名前] =>チェッカーズ
(
[価格] => 9.99

)

[1] => 配列
(
[名前] =>チェス
[価格] => 12.99
)

[2] => 配列
(
[名前] => バックギャモン
[価格] => 29.99
)

)




array_reduce() 関数を使用して簡単に実装できます。

コードは次のとおりです コードをコピー

関数フィルターゲーム($game){
return ($game['price'] }

$names = array_filter($games, 'filterGames');

array_reduce() 関数は、コールバック関数を満たさないすべての要素をフィルターで除外します。この例のコールバック関数は filterGames です。価格が 11.99 より低い要素はすべて保持され、その他は削除されます。このコード スニペットの実行結果:

コードは次のとおりです コードをコピー
配列
(
[1] => 配列
(
[名前] =>チェッカーズ
[価格] => 9.99
)
)

オブジェクトを配列に変換する
要件の 1 つは、オブジェクトを配列形式に変換することです。この方法は思っているよりもはるかに簡単で、強制的に変換するだけで十分です。例:

コードは次のとおりです コードをコピー

クラスゲーム{
パブリック $name;
公開価格;
}

$game = 新しいゲーム();
$game->name = 'チェス';
$ゲーム->価格 = 12.99;

print_r(array($game)); この例を実行すると、次の結果が生成されます。

配列

(
[0] => ゲームオブジェクト
(
[名前] => チェス
[価格] => 12.99
)
)

オブジェクトを配列に変換すると、予期しない副作用が生じる可能性があります。たとえば、上記のコード スニペットでは、すべてのメンバー変数はパブリック型ですが、プライベート変数の戻り結果は異なります。別の例を次に示します:

コードは次のとおりですコードをコピー
クラスゲーム{

パブリック $name;
プライベート $_price;

パブリック関数 setPrice($price) {

$this->_price = $price;
}
}

$game = 新しいゲーム();

$game->name = 'チェス';
$game->setPrice(12.99);

print_r(array($game));このコード スニペットを実行します:

配列

(
[0] => ゲームオブジェクト
(
[名前] => チェス
[_price:ゲーム:プライベート] => 12.99
)
)

ご覧のとおり、区別するために、配列に保存されたプライベート変数のキーが自動的に変更されます。

配列の「自然な順序付け」

「英数字」文字列に対する PHP のソート結果は未定義です。たとえば、配列に多数の画像名が保存されているとします。

コードは次のとおりですコードをコピー$arr = 配列(

この配列をどのようにソートしますか? sort() を使用して配列を並べ替えると、結果は次のようになります:

0=>'madden2011.png',
1=>'madden2011-1.png',
2=>'madden2011-2.png',
3=>'madden2012.png'
);
コードは次のとおりです コードをコピー
配列
(
[0] =>madden2011-1.png
[1] =>madden2011-2.png
[2] =>madden2011.png
[3] =>madden2012.png
)

これが望ましい場合もありますが、元の添字を保持したい場合はどうすればよいでしょうか?この問題を解決するには、自然な方法で配列を並べ替える natsort() 関数を使用できます。

コードは次のとおりですコードをコピー
<?php

$arr = 配列(
0=>'madden2011.png',
1=>'madden2011-1.png',
2=>'madden2011-2.png',
3=>'madden2012.png'
);
natsort($arr);

echo "<pre>"; print_r($arr); echo "</pre>";
?>

実行結果:

配列

(
[1] =>madden2011-1.png
[2] =>madden2011-2.png
[0] =>madden2011.png
[3] =>madden2012.png
)

http://www.bkjia.com/PHPjc/632897.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632897.html技術記事 PHP でデータを走査するときは、list、foreach、および each が一般的に使用されますが、次のチュートリアルでは使用されない可能性があります。配列の走査の高度な例をいくつか紹介したいと思います...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

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

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

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

CakePHP の日付と時刻

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

CakePHP プロジェクトの構成

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

CakePHP ファイルのアップロード

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

CakePHP ルーティング

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

CakePHP について話し合う

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

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP クイックガイド

See all articles