以下のように、多次元配列の配列をペチャンコにする関数(array_flatten)ってどうかきますか?
<?php
$arr[0] = 'a';
$arr[1][0] = 'b';
$arr[1][1][0] = 'c';
$arr[1][1][1][0] = 'd';
$arr[1][1][1][1][0] = 'e';
$arr[1][1][1][2] = 'f';
$arr[1][1][2] = 'g';
$arr[1][2] = 'h';
$arr[2] = 'i';
function array_flatten($arg){
処理;
}
$new_arr = array_flatten($arr);
print_r($new_arr);
?>
↓
Array
(
[0] => a
[1] => b
[2] => c
[3] => d
[4] => e
[5] => f
[6] => g
[7] => h
[8] => i
)
※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、
同関数を再帰的に呼び出したら、その配列が初期化されますよね?
No.1ベストアンサー
- 回答日時:
function array_flatten($array){
static $result;
if( is_array($array) ){
foreach($array as $val){
flat($val);
}
}else{
$result[]=$array;
}
return $result;
}
これで目的の挙動を得られるかと・・・
ポイントはstatic指定でしょうか?
ありがとうございます確認しました!
static!
私が探していたのは、まさにこれです。
以下のページが参考になりました。
http://php.plus-server.net/language.variables.sc …
PHP歴一ヶ月なので、頑張りま~す。
No.3
- 回答日時:
せっかくなのでarray_walkをつかって・・・
<?php
$arr[0] = 'a';
$arr[1][0] = 'b';
$arr[1][1][0] = 'c';
$arr[1][1][1][0] = 'd';
$arr[1][1][1][1][0] = 'e';
$arr[1][1][1][2] = 'f';
$arr[1][1][2] = 'g';
$arr[1][2] = 'h';
$arr[2] = 'i';
function array_flattent($item,$key,$ret){
if(is_array($item)) array_walk($item,"array_flattent",&$ret);
else $ret[]=$item;
}
array_walk($arr,"array_flattent",&$new_arr);
print "<pre>";
print_r($new_arr);
print "</pre>";
?>
PHP5からは再帰的なarray_walk_recursive()なども用意されている
ようです。
ありがとうございます確認しました!
皆さんの回答例、本当に勉強になります。
こちらは、やはり array_walk ですね。
PHP初心者なので、何の宣言もなく
> array_walk($arr,"array_flattent",&$new_arr);
いきなりリファレンスを渡しているところが、なんとも斬新です。
シンプルな回答例ありがとうございました!
あ、今回の件とは関係ないですが、print_r や var_dump が見にくくて困ってました。<pre>タグ使って、出してやればいいのか・・・。
ありがとうございます。
No.2
- 回答日時:
いろんなやり方があるでしょうが
function array_flatten($array){
$result = array();
foreach($array as $val){
if( is_array($val) ){
$result = array_merge($result, array_flatten($val));
}else{
$result[]=$val;
}
}
return $result;
}
ありがとうございます確認しました!
> $result = array();
私も、こうやって、再帰的に呼び出した時に、毎回初期化されて困ったな・・・、と思っていたのですが、
> $result = array_merge($result, array_flatten($val));
なるほど。
こうすれば、毎回新しい配列 $result で問題ないってことですね。
ANo.1 と、潜って行き方が根本的に違いますね。
勉強になりました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) excel vbaの配列なんですが・・・ 1 2022/12/26 18:50
- JavaScript 配列の1要素を代入した変数を使って元の配列要素を削除できるか 1 2023/07/28 03:34
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- PHP c言語 文字 - '1'+26 3 2022/03/26 20:58
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# int temp = 0; if(isdigit(arr[i])){//文字が数字であれば(0~9) 1 2022/03/27 01:37
- Visual Basic(VBA) vb.netです。2次元配列の要素をFor Eachでひとつづつ取得したい。 4 2022/07/05 11:30
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpでforeachの中にforeachがあ...
-
$_POST受信で必要項目のみを結...
-
構造体の中でユーザー定義型の...
-
Mac トロイの木馬”Flashback"に...
-
連想配列でキーを利用して一部...
-
配列を比較して同じものがあっ...
-
Excel VBAでフィルター後の対象...
-
シャッフルしたデータを正確に...
-
formの情報を連想配列に
-
foreachで上限回数指定方法また...
-
C言語の配列をPush(追加)する...
-
配列をループでたくさん宣言し...
-
ファイルから指定行数分だけ読...
-
forとかで連番の変数を一気に格...
-
配列の要素(value)に、変数を...
-
セッション配列の取得の仕方
-
CArrayのソート
-
読み(あ行~わ行)ごとに分け...
-
verilogで、配列の一部をタスク...
-
PHPのカッコ[ ]の使い方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPでこのコード自体に意味は無...
-
マッチング処理(1:N)
-
foreachで上限回数指定方法また...
-
PHP、{}記号の意味
-
PHPで変数名にハイフンを使うに...
-
PHPで連想配列のプルダウンメニ...
-
VB.NET で 二次元のハッシュは...
-
多次元配列を、1次元の配列にす...
-
配列からプルダウン用のHTMLを生成
-
Smartyでインクリメント
-
phpでforeachの中にforeachがあ...
-
foreachとかの勝手な省略?
-
Excel VBAでフィルター後の対象...
-
foreachで配列を、左から縦3列...
-
$_POST受信で必要項目のみを結...
-
リストボックス複数選択抽出方法
-
POSTで渡されるデータの数がわ...
-
ftokが動かない?
-
foreachの間にテーブルの<TR>を...
-
3つの連想配列を交互に代入し...
おすすめ情報