it-swarm.com.ru

Как убрать префикс в ключах массива

Я пытаюсь удалить префикс в ключах массива, и каждая попытка терпит неудачу. Чего я хочу достичь, так это:

Имея: Array ( [attr_Size] => 3 [attr_Colour] => 7 ) 

Получить: Array ( [Size] => 3 [Colour] => 7 ) 

Ваша помощь будет высоко ценится ...

14
rat4m3n

Один из способов получить: 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); 

3
TigerTiger

Если я понял ваш вопрос, вам не нужно использовать 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 ) 
4
Frosty Z

Вот еще кое-что, что можно пережить, и это можно повторно использовать для нескольких массивов в вашем приложении, которые имеют разные префиксы клавиш. Это было бы полезно, если у вас есть ключи с префиксом 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"
}
0
Ligemer