【问题标题】:How to remove prefix in array keys如何删除数组键中的前缀
【发布时间】:2012-01-26 17:10:33
【问题描述】:

我尝试删除数组键中的前缀,但每次尝试都失败了。我想要实现的是:

有:Array ( [attr_Size] => 3 [attr_Colour] => 7 )

获取:Array ( [Size] => 3 [Colour] => 7 )

您的帮助将不胜感激...

【问题讨论】:

  • 所以你只想从你的数组键中删除attr_?这和implode() 有什么关系? attr_my_prop 应该变成 my_propprop 还是别的什么?最重要的是,为什么?我们可以看看你的“失败”代码吗?

标签: php arrays key implode


【解决方案1】:

获取方式之一:Array ( [Size] => 3 [Colour] => 7 ) 来自您的Having: Array ( [attr_Size] => 3 [attr_Colour] => 7 )

$new_arr = array();
foreach($Your_arr as $key => $value) {

list($dummy, $newkey) = explode('_', $key);
$new_arr[$newkey] = $value;

}

如果您认为键中有多个下划线,只需将 foreach 中的第一行替换为 list($dummy, $newkey) = explode('attr_', $key);

【讨论】:

  • 见下文以获得更可取的答案。
  • 这不应该是 IMO 批准的答案。请参阅下文了解如何使用更合适的 array_keys() 函数。它避免了这个答案中的循环。对不起,我投了-1票。
  • @Ligemer 您可以有自己的意见,但这并不意味着您是对的。要获得问题中描述的结果,您需要循环。有太多像你这样的人在不了解需要什么的情况下拖着投票。
  • @HappyApe,由于您似乎错过了我的意思,因此我专门为您添加了答案。放松,这只是软件。我希望你能改进你的代码,但却猛烈抨击我(如果你改变它,我会删除反对票)。您的答案不是动态的,并且依赖于其中包含下划线的键。我在下面的回答接受所有字符串作为要替换的前缀。
  • @Ligemer - 现在锅把水壶叫黑了。你告诉我我错过了重点,但你似乎错过了重点。我回答的问题是“获得所需输出的方法之一是......” OP 并没有要求找到最动态或最有效的方法来分解数组键,但他只是想实现所需的输出我的回答是,他接受了。我不是在抨击你,但你在 4 年后回答了这个问题,那时我是第一个回答这个问题的人,所有的答案都是在那之后发布的。
【解决方案2】:

这里还有一些东西需要细细琢磨,它可以在你的应用程序中用于多个具有不同键前缀的数组。如果你有 Redis 前缀键来重新映射或类似的东西,这将很有用。

$inputArray = array('attr_test' => 'test', 'attr_two' => 'two');

/**
 * Used to remap keys of an array by removing the prefix passed in
 *
 * Example:
 * $inputArray = array('app_test' => 'test', 'app_two' => 'two');
 * $keys = array_keys($inputArray);
 * array_walk($keys, 'removePrefix', 'app_');
 * $remappedArray = array_combine($keys, $inputArray);
 *
 * @param $value - key value to replace, should be from array_keys
 * @param $omit - unused, needed for prefix call
 * @param $prefix - prefix to string replace in keys
 */
function removePrefix(&$value, $omit, $prefix) {
    $value = str_replace($prefix, '', $value);
}

// first get all the keys to remap
$keys = array_keys($inputArray);

// perform internal iteration with prefix passed into walk function for dynamic replace of key
array_walk($keys, 'removePrefix', 'attr_');

// combine the rewritten keys and overwrite the originals
$remappedArray = array_combine($keys, $inputArray);

// see full output of comparison
var_dump($inputArray);
var_dump($remappedArray);

输出:

array(2) {
  'attr_test' =>
  string(4) "test"
  'attr_two' =>
  string(3) "two"
}
array(2) {
  'test' =>
  string(4) "test"
  'two' =>
  string(3) "two"
}

【讨论】:

    【解决方案3】:

    如果我理解了你的问题,你就不必使用implode() 来获得你想要的。

    define(PREFIX, 'attr_');
    
    $array = array('attr_Size' => 3, 'attr_Colour' => 7);
    
    $prefixLength = strlen(PREFIX);
    
    foreach($array as $key => $value)
    {
      if (substr($key, 0, $prefixLength) === PREFIX)
      {
        $newKey = substr($key, $prefixLength);
        $array[$newKey] = $value;
        unset($array[$key]);
      }
    }
    
    print_r($array); // shows: Array ( [Size] => 3 [Colour] => 7 ) 
    

    【讨论】:

    • 太棒了!作品。现在看起来很简单。非常感谢。
    • 不客气。请不要忘记投票/接受您满意的答案:)
    猜你喜欢
    • 2023-03-22
    • 2013-06-10
    • 1970-01-01
    • 2017-08-15
    • 2011-04-27
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多