1

我想使用一个函数来呈现一个数组键,以便以后可以使用它。我什至不知道这样的事情是否可行。我现在拥有的功能看起来像这样

function array_key_render($key){

        $result     = explode('.', $key);
        $num        = count($result);

        for($i=0;$i<$num;$i++){
            $array_key .= [$result[$i]];
        }

        return $array_key;

    }

主要想法是我可以输入 iePRODUCT.PRIZE然后我想找回类似的东西

['产品']['奖品']

更新:即当我有一个带有数字键的数组时:

Array
(
    [PRODUCT] => Array
        (
            [0] => Array
                (
                    [NAME] => jeans
                    [TITLE] => Blop
                    [PRIZE] => Array
                        (
                            [NEW] => 13.23€
                            [0] => 24,40€
                        )

                )

            [1] => Array
                (
                    [NAME] => Pullover
                    [TITLE] => OMG
                    [PRIZE] => Array
                        (
                            [0] => 13.23€
                            [NEW] => 24,40€
                        )

                )

        )

)

当我选择 PRODUCT.PRIZE 时,我选择的答案会返回 false。我怎样才能为所有数字键制作某种通配符以使它们匹配?像 PRODUCT.*.PRIZE 这样的东西

整个事情都是为了一个小模板引擎。如果您对我有一些指示或提示,那就太好了。

4

6 回答 6

2

你的函数返回一个字符串,所以这不起作用

$a = array("PRODUCT" => array("PRICE" => 10.99)); 
$key = array_key_render("PRODUCT.PRICE");
echo $a[$key];

不过,我可以看到你要去哪里。

<PRE>
<?php

// Obtain an array of keys based on our dotted string
function array_key_render($key)
{
  $result = explode('.', $key);

  return $result;

}

// iterate over the array using the known keys trying to find the right element
function array_access($key, $_array)
{
    $array = $_array;
    $keys = array_key_render($key);

    $found_keys = 0;

    foreach($keys as $k)
    {
        if(isset($array[$k]))
        {
            $array = $array[$k];
            $found_keys++;
        }
        // Oh no, we are lost, break, the keys were not found
        else
        {
            break;
        }
    }

    // Check that we found all the keys we were looking for
    if($found_keys == count($keys))
        return $array;

    return false;
}

$a = array("PRODUCT" => array("PRICE" => 10.99)); 

$key = "PRODUCT.PRICE";

var_dump(array_access($key, $a));

$key = "PRODUCT.NOWAY";

var_dump(array_access($key, $a));

$a = array("PRODUCT" => array("PRIZE" => "REP"));

$key = "PRODUCT.PRIZE";

var_dump(array_access($key, $a));
于 2013-07-19T21:04:43.233 回答
1

快速解决方案,从 $result 数组的最后一个元素开始并将其添加到 $array 索引:

$array = $value;
for($i=$num-1;$i>=0;$i--){
            $array[$result[$i]] = $array;
}

因此,如果输入为 PRODUCT.PRIZE.BLA1.BLA2,则输出将为 $array[PRODUCT][PRIZE][BLA1][BLA2]

于 2013-07-19T21:04:50.583 回答
1

我还没有测试过这段代码,所以先试试看。无论如何:首先将 for 循环更改为:

for($i=0;$i<$num;$i++){
  $array_key .= "[" . $result[$i] ."]";
}

一旦你有了变量的字符串表示,你就可以在生成的字符串上调用 eval()。大多数模板引擎都使用 eval,但要注意许多安全问题。

于 2013-07-19T20:59:41.397 回答
0

我想这是你想要的

function array_key_render($key){
  $keys = array_reverse(explode('.', $key));
  $array = "somevalue";
  foreach ($keys as $key){
    $array = array($key => $array);
  }
  return $array;
}
于 2013-07-19T21:06:43.540 回答
0

尝试这个

function array_key_render($key){

        $result     = explode('.', $key);
        $num        = count($result);
        $arr = array();

        for($i=0;$i<$num;$i++){
            $arr[$result[$i]] = array("price" => $i);
        }

    }

我假设你的 $key 看起来像这样。“1.2.3.4.5”

仅供参考:没有经过测试,也不太明白你想要做什么......希望这会有所帮助

于 2013-07-19T20:58:25.977 回答
0
$string  = 'This.is.my.string';
function stringArray($string = '', $result = array()) 
{
  $keys = explode('.', $string);
  foreach(array_reverse($keys) as $key) {
    $result = array_fill_keys(array($key), $result);
  }
  return $result;
}
print_r(stringArray($string));
于 2013-07-19T21:42:34.813 回答