人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPで質問です。
多次元(次元数は決まっていない)の連想配列の中身のデータを変更しなければならないのですが
サーバーがPHP4しかなく、array_walk_recursive()が使えず、
同一の関数を実装しなければなりません。

恐れ入りますが、やり方をお教えいただけますでしょうか?

●質問者: makocan
●カテゴリ:インターネット ウェブ制作
✍キーワード:PHP サーバー データ 次元 連想配列
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● pahoo
●23ポイント

array_walkを使ってできると思います。下記サイトを参考にしてみてください。

◎質問者からの返答

上記ではNGとなります。

多次元配列を一次元に変えられてしまうので。。。

array_walk_recursive()は多次元はそのまま保持されたと思います。


2 ● pahoo
●23ポイント

array_walk_recursive()は多次元はそのまま保持されたと思います。

もちろん、array_walkも多次元のまま処理できます。

◎質問者からの返答

上記のgooの質問者は、多次元を一次元に変換する

方法を聞いておりまして、回答者もそれに準じて答えてしまっております。

下記が一人の回答者のソースの抜粋なのですが、

これでは、$new_arr[0]、$new_arr[1]と保持されてしまいます。

下記を加味し、多次元を保つための変更処理をお教えいただけますでしょうか?

$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 "

";

print_r($new_arr);

print "

";

?>


3 ● tobeoscontinue
●22ポイント

phpのマニュアルに記述されているコードは使えないでしょうか

http://php.benscom.com/manual/ja/function.array-walk-recursive.p...


4 ● tezcello
●22ポイント

> 下記を加味し、多次元を保つための変更処理をお教えいただけますでしょうか?

どのような処理をしたいのか、元の配列の値を保持したいのか、の辺りが不明ですが

こんなのを書いてみました。

(もう一つ再帰が分っていないので詳細はよく分らない...)

$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_value_edit(&$value, $key, $res){
if(is_array($value)){
$res[$key] = $value;
array_walk($value, 'array_value_edit', &$res[$key]);
}else{
$res[$key] = 'edited_value "'.$value.'"';
}
}
$result = array(); // 修正結果が返る配列
array_walk($arr, 'array_value_edit', &$result);

print "<pre>\n";
print_r($result);
print "</pre>\n";

結果は

Array

(

[0] => edited_value "a"

[1] => Array

(

[0] => edited_value "b"

[1] => Array

(

[0] => edited_value "c"

[1] => Array

(

[0] => edited_value "d"

[1] => Array

(

[0] => edited_value "e"

)

[2] => edited_value "f"

)

[2] => edited_value "g"

)

[2] => edited_value "h"

)

[2] => edited_value "i"

)

です。

元の配列の値を直接変更してよいなら、

function array_value_edit(&$value, $key, $word){
if(is_array($value)){
array_walk($value, 'array_value_edit', $word);
}else{
$value = $word.$value;
}
}
$result = array();
$add_word = 'add words ';
array_walk($arr, 'array_value_edit', $add_word);

print "<pre>\n";
print_r($arr);
print "</pre>\n";

exit;

結果は

Array

(

[0] => add words a

[1] => Array

(

[0] => add words b

[1] => Array

(

[0] => add words c

[1] => Array

(

[0] => add words d

[1] => Array

(

[0] => add words e

)

[2] => add words f

)

[2] => add words g

)

[2] => add words h

)

[2] => add words i

)

http://jp.php.net/manual/ja/function.array-walk.php

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ