PHPで質問です。

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

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

回答の条件
  • URL必須
  • 1人30回まで
  • 登録:2008/03/04 21:27:59
  • 終了:2008/03/11 21:30:02

回答(4件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/03/04 21:55:49

ポイント23pt

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

id:makocan

上記ではNGとなります。

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

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

2008/03/04 22:41:34
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/03/04 22:55:23

ポイント23pt

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

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

id:makocan

上記の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 "

";

?>

2008/03/04 23:04:30
id:tobeoscontinue No.3

tobeoscontinue回答回数213ベストアンサー獲得回数532008/03/05 11:04:42

ポイント22pt

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

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

id:tezcello No.4

tezcello回答回数460ベストアンサー獲得回数692008/03/05 13:42:57

ポイント22pt

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

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

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

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

$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

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません