1

私は今、この再帰関数を 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';

あなたが助けてくれることを願っています! ジェイ

4

1 に答える 1

1

これも再帰的に解決する必要があるとは思いません:

<?php
function putData($str, $data)
{
    // Repeat the replacing process until no more matches are found:
    while (preg_match("/%(.*?)%/si", $str, $matches))
    {
        // Use $matches to make your replaces
    }
    return $str;
}
?>
于 2013-07-15T17:21:08.960 に答える