2

要素キーとして文字列を使用して、配列の要素を動的に設定/取得したいと思います。
そこで、文字列を複数のキー配列に変換する良い方法を探しています。
私は誇りに思っていない醜いコードで期待される結果に達します。

function arrayElementSet($str, $value, array &$array)
{
    $arrayStr = "['".preg_replace('/\./', "']['", $str)."']";
    eval('$array'.$arrayStr.'="'.$value.'";');
}

function arrayElementGet($str, array &$array)
{
    $arrayStr = "['".preg_replace('/\./', "']['", $str)."']";
    eval('$ret=$array'.$arrayStr.';');
    return $ret;
}

$array = array();
arrayElementSet('d0.d1.d2.d4', 'bar', $array);
$wantedElement = arrayElementGet('d0.d1.d2', $array);
print_r($array);
/*
wantedElement looks like:
Array
(
    [d4] => bar
)
$array looks like:
Array
(
    [d0] => Array
        (
            [d1] => Array
                (
                    [d2] => Array
                        (
                            [d4] => bar
                        )
                )
        )
)
*/

しかし、それはかなり醜いです。さらに、 eval() 関数を避けたいと思います。
私は特に配列ソリューションに執着しているわけではありません。オブジェクトなどを使用した優れたソリューションがあれば、それを採用します。


編集:

知っておくだけです。Laravel の 2 つのヘルパー関数 (array_get と array_set) がすぐに使用できます。

4

2 に答える 2

2

スプリット&トラバース:

<?php
function arrayElementSet($str, $value, array &$array, $delimiter = '.') {
  $parent =& $array;
  foreach (explode($delimiter, $str) as $key) {
    if (!array_key_exists($key, $parent)) {
      $parent[$key] = array();
    }  

    $parent =& $parent[$key];
  }

  $parent = $value;
}

function arrayElementGet($str, array &$array, $delimiter = '.') {
  $parent =& $array;
  foreach (explode($delimiter, $str) as $key) {
    if (!array_key_exists($key, $parent)) {
      return null;
    }  

    $parent =& $parent[$key];
  }

  return $parent;
}

$array = array();
arrayElementSet('d0.d1.d2.d4', 'bar', $array);
$wantedElement = arrayElementGet('d0.d1.d2', $array);

print_r($array);
print_r($wantedElement);

http://codepad.viper-7.com/maNmOT

于 2013-06-04T11:42:47.730 に答える