2

ナビゲーション位置文字列をマスター配列に分割しようとしています。

たとえば、位置が1.2.2のアイテムがある場合

次のようにマスターアレイに追加したいと思います

 1 =>
    2 =>
        2 => array()

そして、別のアイテムに「2.1」がある場合

 1 =>
    2 =>
        2 => array()
 2 =>
    1 => array()

そして別の「1.2.3」

 1 =>
    2 =>
        2 => array()
        3 => array()
 2 =>
    1 => array()

誰かがこれを行う方法を知っていますか?

よろしく

編集

オブジェクトの1次元配列があるとしましょう。それらをループして、ネストされた配列のような構造化された「ナビゲーション」として格納します。各アイテムには、ナビゲーション位置文字列、つまり1.2.3.6があります

$depth = explode( '.', $details['navigation_pos'] );次に、オブジェクトを正しい位置に配置するために、ある種のアレイウォーカーにそれを実行することを考えていました。

お役に立てれば

編集

多分それを置くためのより良い方法はこれですが、よりエレガントに:

$depth = explode( '.', '1.2.3.4' );
$bar = json_decode( '{"' . implode( '":{"', $depth ) . '":[]' . str_repeat( '}', sizeof( $depth ) ) );
print_r($bar);

これは

stdClass Object
(
    [1] => stdClass Object
        (
            [2] => stdClass Object
                (
                    [3] => stdClass Object
                        (
                            [4] => Array
                                (
                                )

                        )

                )

        )

)
4

1 に答える 1

0

eval()コンストラクトを使用できますが、注意してください。

eval() 言語構造は、任意の PHP コードを実行できるため、非常に危険です。したがって、その使用はお勧めできません。この構文を使用する以外に選択肢がないことを慎重に確認した場合は、ユーザーが提供したデータを事前に適切に検証せずに渡さないように特に注意してください。

$final_array = array(); // The output array

/*
    Example:
    $big_array = array(
        '1.1' => 'One-one',
        '2.1.3.4' => 'Two-one-three-four'
    );
*/  

foreach ($big_array as $position_string => $item)
{
    $index_array = explode(".", $position_string);

    foreach ($index_array as $key => $value)
    {       
        // Make sure only integers are put through eval()
        $index_array[$key] = (int)$value;
    }

    $indexes = implode("][", $index_array);

    // TODO: make sure $item is safe to put through eval()!
    eval("\$final_array[{$indexes}] = \$item");
}
于 2013-02-19T07:44:28.730 に答える