3

多次元配列内のオブジェクトへのアクセスに問題があります。

コンテキスト

Name基本的に、、、などIDで構成されるオブジェクト (カテゴリ) がありParentIDます。ultimateArray多次元の配列もあります。

特定のカテゴリについて、getPath()配列を返す関数 ( ) を作成していますids。たとえば、という名前のオブジェクトGranny SmithparentID406 であるため、Food(5) -> Fruits(101) -> Apples(406) の子です。この関数は、オブジェクトの親の ID の配列または文字列を返します。上記の例では、5 -> 101 -> 406または["5"]["101"]["406"]または[5][101][406]. 食べ物はルートカテゴリです!

問題

私がする必要があるのは、から返されたものgetPath()を使用してカテゴリ ID 406(Apples) にアクセスし、オブジェクトGranny Smithを の子に追加できるようにすることですApples

機能$path = $this->getPath('406');は適応可能です。次の行で返されるものを使用するのが難しいだけです:

$this->ultimate[$path]['Children'][]= $category;

ハードコーディングすると機能します:

$this->ultimate["5"]["101"]["406"]['Children'][]= $category;
//or
$this->ultimate[5][101][406]['Children'][]= $category;

どんな助けでも大歓迎です。

4

2 に答える 2

2

以下のような配列があるとします

<?php
$a = array(
        12 => array(
                65 => array(
                    90 => array(
                        'Children' => array()
                    )
                )
            )
    );

$param = array(12, 65, 90); // your function should return values like this
$x =& $a; //we referencing / aliasing variable a to x
foreach($param as $p){
    $x =& $x[$p]; //we step by step going into it
}
$x['Children'] = 'asdasdasdasdas';
print_r($a);

?>`

参照またはエイリアスを試すことができ
ます http://www.php.net/manual/en/language.references.whatdo.php
アイデアは、配列のエイリアスである変数を作成し、変数から深く掘り下げることです。文字列から多次元キーを直接割り当てることはできません(AFAIK)


出力

Array
(
    [12] => Array
        (
            [65] => Array
                (
                    [90] => Array
                        (
                            [Children] => asdasdasdasdas
                        )

                )

        )

)
于 2013-05-03T14:56:44.107 に答える
0

再帰関数を使用してメンバーにアクセスできます。キーがパスと一致しない場合、これは NULL を返しますが、そこでエラーまたは例外をスローすることもできます。また、パスに「子供」を追加したことにも注意してください。これを一般的に使用できるようにしました。パスに子なしでそれを行う方法を示すために編集を行いました。

<?php

$array = array(1 => array(2 => array(3 => array("Children" => array("this", "are", "my", "children")))));
$path = array(1, 2, 3, "Children");
$pathWithoutChildren = array(1, 2, 3);

function getMultiArrayValueByPath($array, $path) {
    $key = array_shift($path);
    if (array_key_exists($key, $array) == false) {
        // requested key does not exist, in this example, just return null
        return null;
    }
    if (count($path) > 0) {
        return getMultiArrayValueByPath($array[$key], $path);
    }
    else {
        return $array[$key];
    }
}

var_dump(getMultiArrayValueByPath($array, $path));
$results = getMultiArrayValueByPath($array, $pathWithoutChildren);
var_dump($results['Children']);
于 2013-05-03T14:50:30.157 に答える