【问题标题】:PHP Key name arrayPHP 键名数组
【发布时间】:2011-01-31 22:19:44
【问题描述】:

我有一个数组 $data

 fruit => apple,
 seat => sofa,

等等。我想循环,以便每个键变成 type_key[0]['value'] 所以例如

 type_fruit[0]['value'] => apple,
 type_seat[0]['value'] => sofa,

以及我认为会这样做的,即

foreach ($data as $key => $value)
{
        # Create a new, renamed, key. 
        $array[str_replace("/(.+)/", "type_$1[0]['value']", $key)] = $value;

        # Destroy the old key/value pair
        unset($array[$key]);

}

print_r($array);

不起作用。我怎样才能让它发挥作用?

另外,我希望键(而不是值)中的所有内容都是小写的:是否也有一种简单的方法可以做到这一点?谢谢。

【问题讨论】:

  • 我不确定你在这里期待什么。您希望 KEY 看起来像 type_fruit[0]['value'],因此您可以使用 $array["type_fruit[0]['value']"] 访问它?

标签: php regex arrays key rename


【解决方案1】:

你的意思是你想把键做成单独的数组吗?还是您的意思是只更改同一数组中的键?

    $array = array();
    foreach ($data as $key => $value)
    {
        $array['type_' . strtolower($key)] = array(array('value' => $value));
    }

如果您希望您的键是单独的变量,请执行以下操作:

    extract($array);

现在您将拥有 $type_fruit 和 $type_sofa。您可以通过 $type_fruit[0]['value'] 找到您的值,因为我们在其中放置了一个额外的嵌套数组。

【讨论】:

  • 别忘了 strtolower() 键:)
【解决方案2】:

您的要求听起来……很可疑。也许你的意思是这样的:

$arr = array('fruit' => 'apple', 'seat' => 'sofa');
$newarr = array();

foreach ($arr as $key => $value)
{
  $newkey = strtolower("type_$key");
  $newarr[$newkey] = array(array('value' => $value));
}

var_dump($newarr);

【讨论】:

    【解决方案3】:

    首先,我不会更改输入数组,而是创建一个新数组,除非您的内存限制遇到严重问题。
    然后您不能简单地替换键以向数组添加更深的嵌套级别。 $x[ 'abc[def]' ] 仍然只引用顶级元素,因为 abc[def] 被解析为一个字符串,但您想要 $x['abc']['def']

    $data = array(
     'fruit' => 'apple',
     'seat' => 'sofa'
    );
    
    $result = array();
    
    foreach($data as $key=>$value) {
      $target = 'type_'.$key; 
      // this might be superfluous, but who knows... if you want to process more than one array this might be an issue.
      if ( !isset($result[$target]) || !is_array($result[$target]) ) {
        $result[$target] = array();
      }
      $result[$target][] = array('value'=>$value);
    }
    
    var_dump($result);
    

    【讨论】:

      【解决方案4】:

      初学者

      $array[str_replace("/(.+)/", "type_$1[0]['value']", $key)] = $value;
      

      应该是

      $array[str_replace("/(.+)/", type_$1[0]['value'], $key)] = $value;
      

      【讨论】:

      • 你在开玩笑吗?您只是进一步中断了他对 str_replace 的调用,而不是使用 preg_replace 来修复它。
      • "type_$1[0]['value']" 将被视为字符串,因此 type_$1[0]['value'] 将返回他正在寻找的值(尽管我同意他使用了错误的功能)
      • 不,不是。中间有一个$。这只是获得syntax error: unexpected $ 的好方法。此外,如何/为什么更好?即使它有效,使用不带引号的字符串文字也会发出一个通知,告诉它不应该完成。
      猜你喜欢
      • 2012-09-16
      • 2018-08-07
      • 2011-12-30
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      相关资源
      最近更新 更多