[PHP-users 32269] Re: 配列から要素を取り出す方法

riseunit_ますだ masuda @ riseunit.jp
2007年 6月 4日 (月) 19:36:48 JST


ますだです。こんばんわ。

失礼かと思いますが…
質問の意図が、まったく分かりません。
まず、何を聞きたいのか?
諸氏の返事では、何が足りないのか?

僕が察するところだと、

$disp_tree[$key]['sub'] = 'answer';
$soeji = 'sub';

// 「answer」を出力
echo $disp_tree[$key]['sub'];
// これでも「answer」を出力可能
echo $disp_tree[$key][$soeji];

// これはエラーです
echo $disp_tree[$key]['$soeji'];
// これは意図する通りには出ません
echo ($echo $disp_tree[$key] . '[' . $soeji . ']');

このくらいのアドバイスになります。

kaz wrote:
> こんにちは 奥井です。
> 
> 実際のスクリプトより例で質問した方がいいかなあと思いましたが、かえって訳わからなくしてしまったみたいですいません。
> ディレクトリを表示するスクリプトをつくっています。
> ディレクトリツリーを作って表を作り、表内でディレクトリをクリックしたらそのディレクトリ内の表を作ります。
> トップディレクトリのツリーを作ってその下のディレクトリへ移る度にディレクトリのツリーを作りなおしているので最初に作ったトップディレクトリツリーから目的のディレクトリツリーの部分のみ抜き出せないかなあと思ってるんです。
> 
> 
> <?php
> //echo $_SERVER["PHP_SELF"];
> 
> global $mode,$url;
> if (isset($_GET['mode'])) {$mode = $_GET['mode'];}
> if (isset($_GET['url'])) {$url = $_GET['url'];}
> $Top = "2007";//top directory
> $tree = make_dirtree($Top);
> 
> $disp_tree = $tree;
> if ($mode == "disp"){
> $disp_tree = make_dirtree($url);	//$tree[$new_url];
> }
> 
> //hyou
> <div align="center">
> <table  cellpadding="2" cellspacing="1" border="2" bgcolor="#ADD8E6" valign="middle" width="80%">
> <tr><th align=center>No</th><th align=center>名前</th><th align=center>コメント</th><th align=center>サイズ</th></tr>
> <?php
> 
> $N = 1;
> foreach( $disp_tree as $key => $value ){
> ?>
> <tr>
> <td align="center">
> <?php
> if ($value['type'] == 'directory'){
> echo "";
> } else {
> echo "(".$N.")";
> $N++;
> }
> ?>
> </td>
> <td>
> <?php
> if ($value['type'] == 'directory'){
> echo "<a href=\"$_SERVER[PHP_SELF]?mode=disp&url=$value[path]\">$value[name]</a>";
> } else {
> 
> echo "<a href=\"$value[path]\">$value[name]</a>";
> }
> ?> 
> </td>
> <td>
> <?php
> if ($value['type'] == 'directory'){
> 	echo "録音ファイル数は".$disp_tree[$key]['numfile']." ";
> 	if (sizeof($disp_tree[$key]['sub']) != $disp_tree[$key]['numfile']){
> 	echo "フォルダ数は".(sizeof($disp_tree[$key]['sub'])-$disp_tree[$key]['numfile']);
> 	}
> } else {
> echo $value['path'];
> }
>  ?> 
> </td>
> <td align="right">
> <?php
> echo $value['size']; ?> 
> </td>
> </tr>
> <?php }	//foreach end
> ?>
> 
> </table>
> </div>
> 
> <?php
> 
> //関数郡
> function make_dirtree($directory){
> 
> static $filecount = 0;
> $temp_directory = array();
> $temp_file = array();
> $stack = array();
> if ($handle = opendir($directory)) {
>     while (false !== ($file = readdir($handle))) {
>         if ($file != "." && $file != "..") {
>         		if (is_dir($directory.'/'.$file)){
> 			array_push($stack,$filecount);		//$filecountプッシュ 
> 			$filecount = 0;	
> 			$temp_directory[$file] = array('type' => 'directory',
> 									'name' => $file,
> 									'path' => $directory.'/'.$file,
> 									'size' => formatted_dirsize($directory.'/'.$file),
> 									'sub' =>make_dirtree($directory.'/'.$file),
> 									'numfile' => $filecount);
> 			$filecount = array_pop($stack);		//$filecountポ
>             	} else {
>              	$temp_file[$file] = array('type' => 'file',
>              						'name' => $file,
>              						'path' => $directory.'/'.$file,
>              						'size' => formatted_filesize(0,$directory.'/'.$file));
>              	$filecount++;
>             	}
>         }
>     }
> closedir($handle);
> } else {
> 	$erorr="ディレクトリのオープンに失敗しました!!";
> 	echo $erorr;
> }
> ksort($temp_directory);
> ksort($temp_file);
> $result = array_merge($temp_directory,$temp_file);
> return $result;
> }
> 
> function formatted_dirsize( $dir )
> {
> $dir_size = `du -s $dir`;             // Unix command
> $tmp_bytes = substr($dir_size,0,strpos($dir_size, "/")-4);
> $tmp_bytes1 = $tmp_bytes*1024;
> $bytes = formatted_filesize($tmp_bytes1);
> return $bytes;
> }
> 
> 
> function formatted_filesize($filesize = 0, $filename = '') {
>     $filesize = (int)$filesize;
>     if($filesize == 0 || $filename != '') {
>         $filesize = filesize($filename);
>     }
>     $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
>     $unit_count = (count($units) - 1);
>     $pass = 0; // set zero, for Bytes
>     while( $filesize >= 1024 && $pass < $unit_count ) {
>         $filesize /= 1024;
>         $pass++;
>     }
>     return round($filesize, 1) .'&nbsp;'. $units[$pass];
> }
> 
> ?>
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3
> 



PHP-users メーリングリストの案内