私は今、この再帰関数を 1 日の大半で構築しようとしていますが、思い通りに機能させることができないようです。
まず、関数がアクセスする必要があるデータを保持するプロパティがあります。
$this->data
そして、相対パスに変換することを目的とした次の文字列があります。
$path = 'path.to.%id%-%folder%.containing.%info%';
このような文字列の部分: %value% で見つかったいくつかの動的な値をロードします$this->data property
(次のように:$this->data['id'];
または$this->data['folder'];
さらに興味深いことに、プロパティは次のように自身を参照できます。$this->data['folder'] = 'foldername.%subfolder%';
また、- で区切られた 2 つの %values% もあり、そのままにしておく必要があります。
そのため、問題に対して、データプロパティから動的な値をロードする再帰関数を作成しようとしましたが、新しい値に別の %value% が含まれている場合は、%value% がなくなるまで繰り返します。読み込まれました。
これまでのところ、これは私が思いついたものです:
public function recursiveFolder( $folder, $pathArr = null )
{
$newPathArr = explode( '.', $folder );
if ( count ( $newPathArr ) !== 1 )
{
foreach( $newPathArr as $id => $folder )
{
$value = $this->recursiveFolder( $folder, $newPathArr );
$resultArr = explode( '.', $value );
if ( count ( $resultArr ) !== 1 )
{
foreach ( $resultArr as $nid => $result )
{
$nvalue = $this->recursiveFolder( $result, $newPathArr );
$resultArr[$nid] = $nvalue;
}
}
$resultArr = implode( '.',$resultArr );
$newPathArr[$id] = $resultArr;
}
}
else
{
$pattern = '/%(.*?)%/si';
preg_match_all( $pattern, $folder, $matches );
if ( empty( $matches[0] ) )
{
return $folder;
}
foreach ( $matches[1] as $mid => $match )
{
if ( isset( $this->data[$match] ) && $this->data[$match] != '' )
{
$folder = str_replace( $matches[0][$mid], $this->data[$match], $folder );
return $folder;
}
}
}
return $newPathArr;
}
残念ながら、%values% の複数のレイヤーがあると停止するため、再帰関数ではありませんが、2 つのレイヤーではほとんど機能しません。(この時点で最小限のレベルで機能するようにコーディングしました)。
これがどのように機能するかは次のとおりです。
次のようになります。
'files.%folder%.blog-%type%.and.%time%'
の中へ:
'files.foldername.blog-post.and.2013.feb-12th.09'
これに基づいて:
$data['folder'] = 'foldername';
$data['type'] = 'post';
$data['time'] = '%year%.%month%-%day%';
$data['year'] = 2013;
$data['month'] = 'feb';
$data['day'] = '12th.%hour%';
$data['hour'] = '09';
あなたが助けてくれることを願っています! ジェイ