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

PHPで教えてください。

$array = array(abc1, abc2, abc3, abc4, abc5);

$aaa1[0] = "あいうえ,かきくけこ,さしすせそ";
$aaa1[1] = "たちつてと,なにぬねの";
$aaa1[2] = "はひふへほ,まみむめも,らりるれろ,わをん";

この条件で、

$abc1[0] = "あいうえ";
$abc1[1] = "たちつてと";
$abc1[2] = "はひふへほ";
$abc1[3] = "";
$abc1[4] = "";

$abc2[0] = "かきくけこ";
$abc2[1] = "なにぬねの";
$abc2[2] = "まみむめも";
$abc2[3] = "";
$abc2[4] = "";

$abc3[0] = "さしすせそ";
$abc3[1] = "";
$abc3[2] = "らりるれろ";
$abc3[3] = "";
$abc3[4] = "";

$abc4[0] = "";
$abc4[1] = "";
$abc4[2] = "";
$abc4[3] = "わをん";
$abc4[4] = "";

$abc5[0] = "";
$abc5[1] = "";
$abc5[2] = "";
$abc5[3] = "";
$abc5[4] = "";

$arrayのインデックス順に入っている名前の変数名の配列のインデックス順に入れるには
どうしたらよいでしょうか。

●質問者: akide
●カテゴリ:ウェブ制作
✍キーワード:PHP あい さしすせそ インデックス 名前
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● tasklight
●27ポイント

UTF-8でエンコードされているという前提です。

<?php
$array = array(abc1, abc2, abc3, abc4, abc5);

$aaa1[0] = "あいうえ,かきくけこ,さしすせそ";
$aaa1[1] = "たちつてと,なにぬねの";
$aaa1[2] = "はひふへほ,まみむめも,らりるれろ,わをん";

//配列の分解と代入
foreach ($aaa1 as $key=>$str) {
 $arr = preg_split('/,/u', $str);
 foreach ($arr as $n=>$s) {
 $var = 'abc' . ($n + 1);
 ${$var}[$key] = $s;
 }
}

//結果を表示
for ($i = 1; $i <= 5; $i++) {
 $var = 'abc' . $i;
 echo '$' . $var . ':';
 var_dump($$var);
}
?>

参考:可変変数

◎質問者からの返答

回答ありがとうございます。

頂いたコードですと、

$array = array(abc1, abc2, abc3, abc4, abc5);

$array = array(hoge1, abc2, hoge3, abc4, abc5);

と言った規則性が無い場合には対応できません。

規則性が無くとも対応出来るようにするにはどうしたらよいでしょうか。


2 ● tasklight
●27ポイント

規則性が無くとも対応出来るようにするにはどうしたらよいでしょうか。

http://q.hatena.ne.jp/1284519608#a1037757


以下のようにしてみてください。

<?php
$array = array(hoge1, abc2, hoge3, abc4, abc5);

$aaa1[0] = "あいうえ,かきくけこ,さしすせそ";
$aaa1[1] = "たちつてと,なにぬねの";
$aaa1[2] = "はひふへほ,まみむめも,らりるれろ,わをん";

//配列の分解と代入
foreach ($aaa1 as $key=>$str) {
 $arr = preg_split('/,/u', $str);
 foreach ($arr as $n=>$s) {
 ${$array[$n]}[$key] = $s;
 }
}

//結果を表示
foreach ($array as $var) {
 echo '$' . $var . ':';
 var_dump($$var);
}
?>

3 ● tobeoscontinue
●26ポイント
<?php
function compact_matrix($names, $csv) {
 $cells = array();
 foreach ($csv as $row) $cells[] = explode(',',$row);

 $map = array();
 foreach ($names as $id => $name) {
 $col = array();
 foreach ($cells as $cell) $col[] = $cell["$id"];
 $map["$name"] = $col;
 }
 return $map;
}

function array_dump($name) {
 foreach ($GLOBALS["$name"] as $id => $value) {
 echo '$'.$name.'['.$id.'] = "'.$value.'";'."\n";
 }
 echo "\n";
}

$array = array('abc1', 'abc2', 'abc3', 'abc4', 'abc5');

$aaa1[0] = "あいうえ,かきくけこ,さしすせそ";
$aaa1[1] = "たちつてと,なにぬねの";
$aaa1[2] = "はひふへほ,まみむめも,らりるれろ,わをん";

extract(compact_matrix($array, $aaa1));

array_dump('abc1');
array_dump('abc2');
array_dump('abc3');
array_dump('abc4');
array_dump('abc5');

?>

処理内容がよく理解出来ていませんが書いてみました。

名前から変数を生成する方法として$$nameがありますが連想配列からextractする方法もあります。

http://jp2.php.net/manual/ja/function.extract.php

(注:意図せずローカル変数を書き換えてしまうのでセキュリティーなど使用には注意が必要です。)


$csv($aaa1)を,で区切って二次元の配列$cellsを作ります。

次に$namesで順にcellsの$id番目の要素を全て取り出し$colに追加していきます。

$mapには連想配列で$colを追加していきます。


それをextractでローカル変数に展開しています。


結果が一部($abc4[2])異なります。また空文字の部分は実際はNULLです。

array_dumpはvar_dumpやprint_rでは綺麗に出力できなかったため新た

に書いたもので処理には関係ありません。


$abc1[3]や$abc1[4]は出力されません。必要なら

$aaa1[3] = "";

$aaa1[4] = "";

を追加して下さい。


4 ● nmrdfg
●10ポイント

同感ですね。

http://q.hatena.ne.jp

関連質問


●質問をもっと探す●



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