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

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

WBOY
WBOYオリジナル
2016-07-13 10:47:111042ブラウズ

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() 関数を使用できます。

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

echo "

"; print_r($arr); echo "
";
?>

実行結果:

配列

(
[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 までご連絡ください。