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

ml @ zeul.jp ml @ zeul.jp
2007年 6月 4日 (月) 21:54:18 JST


奥井 様

お世話になります、松岡です。

多分、やりたい事は、、、

------------------------------------------------------------
function array_get_deep($array, $dir)
{
    $ptr = &$array;
    $name_array = explode('/', $dir);
    foreach($name_array as $n) {
        if($n != '') {
            if(!is_array($ptr) && !isset($ptr[$n])) {
                return '';
            }
            $ptr = &$ptr[$n];
        }
    }
    return $ptr;
}
------------------------------------------------------------

$array = array("dir"=>array("file1"=>"AB", "file2"=>"AC"));

array_get_deep($array, "dir/file1") => "AB"

こういう事でしょうか?
あてずっぽですが・・・。

以上、よろしくお願いいたします。










> こんにちは 奥井です。
> 
> 実際のスクリプトより例で質問した方がいいかなあと思いましたが、かえって
訳わからなくしてしまったみたいですいません。
> ディレクトリを表示するスクリプトをつくっています。
> ディレクトリツリーを作って表を作り、表内でディレクトリをクリックしたら
そのディレクトリ内の表を作ります。
> トップディレクトリのツリーを作ってその下のディレクトリへ移る度にディレ
クトリのツリーを作りなおしているので最初に作ったトップディレクトリツリー
から目的のディレクトリツリーの部分のみ抜き出せないかなあと思ってるんです。
> 
> 
> <?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 メーリングリストの案内