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

kaz okui @ sannet.ne.jp
2007年 6月 4日 (月) 19:15:49 JST


こんにちは 奥井です。

実際のスクリプトより例で質問した方がいいかなあと思いましたが、かえって訳わからなくしてしまったみたいですいません。
ディレクトリを表示するスクリプトをつくっています。
ディレクトリツリーを作って表を作り、表内でディレクトリをクリックしたらそのディレクトリ内の表を作ります。
トップディレクトリのツリーを作ってその下のディレクトリへ移る度にディレクトリのツリーを作りなおしているので最初に作ったトップディレクトリツリーから目的のディレクトリツリーの部分のみ抜き出せないかなあと思ってるんです。


<?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 メーリングリストの案内