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のインデックス順に入っている名前の変数名の配列のインデックス順に入れるには
どうしたらよいでしょうか。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2010/09/22 12:05:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:tasklight No.1

回答回数323ベストアンサー獲得回数40

ポイント27pt

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);
}
?>

参考:可変変数

id:akide

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

頂いたコードですと、

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

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

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

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

2010/09/15 13:21:31
id:tasklight No.2

回答回数323ベストアンサー獲得回数40

ポイント27pt

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

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);
}
?>
id:tobeoscontinue No.3

回答回数220ベストアンサー獲得回数59

ポイント26pt
<?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] = "";

を追加して下さい。

id:nmrdfg No.4

回答回数50ベストアンサー獲得回数0

ポイント10pt

同感ですね。

http://q.hatena.ne.jp

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

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

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

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

回答リクエストを送信したユーザーはいません