2

配列へのパスを記述する文字列 ( など) を介して、多次元配列から項目を取得しようとしていますfirst.second.third

ここに示すようにアプローチを選択しました(ideone でも利用できます):

<?php
    // The path into the array
    $GET_VARIABLE = "a.b.c";
    // Some example data
    $GLOBALS["a"]= array("b"=>array("c"=>"foo"));

    // Construct an accessor into the array
    $variablePath = explode( ".", $GET_VARIABLE );
    $accessor = implode( "' ][ '", $variablePath );
    $variable = "\$GLOBALS[ '". $accessor . "' ]";

    // Print the value for debugging purposes (this works fine)
    echo $GLOBALS["a"]["b"]["c"] . "\n";
    // Try to evaluate the accessor (this will fail)
    echo $$variable;
?>

スクリプトを実行すると、次の 2 行が出力されます。

foo
PHP Notice:  Undefined variable: $GLOBALS[ 'a' ][ 'b' ][ 'c' ] in ...

では、なぜこれは適切に評価されないのでしょうか?

4

4 に答える 4

1

ヘルパー関数を使用したもう 1 つのソリューションを次に示します。

function GetValue($path, $scope = false){
    $result = !empty($scope) ? $scope : $GLOBALS;

    // make notation uniform
    $path = preg_replace('/\[([^\]]+)\]/', '.$1', $path); // arrays
    $path = str_replace('->', '.', $path); // object properties

    foreach (explode('.', $path) as $part){
        if (is_array($result) && array_key_exists($part, $result)){
            $result = $result[$part];
        } else if (is_object($result) && property_exists($result, $part)){
            $result = $result->$part;
        } else {
            return false; // erroneous
        }
    }
    return $result;
}

使用例:

// Some example data
$GLOBALS["a"] = array(
  'b' => array(
    'c' => 'foo',
    'd' => 'bar',
   ),
   'e' => (object)array(
     'f' => 'foo',
     'g' => 'bar'
   )
);
$bar = array(
  'a' => $GLOBALS['a']
);

echo $GLOBALS['a']['b']['c'] . "\n"; // original

// $GLOBALS['a']['b']['c']
echo GetValue('a.b.c')       . "\n"; // traditional usage
// $GLOBALS['a']['b']['c']
echo GetValue('a[b][c]')     . "\n"; // different notation
// $bar['a']['b']['c']
echo GetValue('a.b.c', $bar) . "\n"; // changing root object
// $GLOBALS['a']['e']->f
echo GetValue('a[e]->f')     . "\n"; // object notation
于 2013-07-09T15:25:37.697 に答える