PHP массив неустановленная строка - PullRequest
0 голосов
/ 13 октября 2011

Я пытаюсь сбросить группу ключей массива с одинаковым префиксом.Кажется, я не могу заставить это работать.

foreach ($array as $key => $value) {
    unset($array['prefix_' . $key]);
    }

Как я могу получить unset, чтобы увидеть ['prefix_'.$ key] как фактическая переменная?Спасибо

ОБНОВЛЕНИЕ: ключи массива $ будут иметь два ключа с одинаковым именем.Только один будет иметь префикс, и есть около 5 ключей с префиксными ключами:

Array {
   [name] => name
   [prefix_name] => other name
}

Я не хочу удалять [имя] просто [имя_префикс] из массива.

Ответы [ 5 ]

1 голос
/ 13 октября 2011

Это работает:

$array = array(
  'aa' => 'other value aa',
  'prefix_aa' => 'value aa',
  'bb' => 'other value bb',
  'prefix_bb' => 'value bb'
);

$prefix = 'prefix_';
foreach ($array as $key => $value) {
  if (substr($key, 0, strlen($prefix)) == $prefix) {
     unset($array[$key]);
  }
}

Если вы скопируете / вставите этот код на такой сайт, как http://writecodeonline.com/php/,, вы убедитесь, что он работает.

1 голос
/ 13 октября 2011

Я не уверен, что понимаю ваш вопрос, но если вы пытаетесь сбросить все ключи с определенным префиксом, вы можете перебрать массив и просто сбросить те, которые соответствуют префиксу.

Что-то вроде:

<?php
foreach ($array as $key => $value) {      // loop through keys
    if (preg_match('/^prefix_/', $key)) { // if the key stars with 'prefix_'
        unset($array[$key]);              // unset it
    }
}
1 голос
/ 13 октября 2011

Нельзя использовать foreach, потому что это всего лишь копия коллекции.Вам нужно было бы использовать для или захватить ключи отдельно и отделить вашу обработку от массива, которым вы хотите манипулировать.Что-то вроде:

foreach (array_keys($array) as $keyName){
  if (strncmp($keyName,'prefix_',7) === 0){
    unset($array[$keyName]);
  }
}

Вы также уже перебираете коллекцию, получая каждый ключ.Если у вас не было:

$array = array(
  'foo' => 1,
  'prefix_foo' => 1
);

(где у каждого ключа также есть соответствующий ключ с префиксом "перед ним"), вы столкнетесь с проблемами.

0 голосов
/ 13 октября 2011

Я считаю, что это должно работать:

foreach ($array as $key => $value) {
    unset($array['prefix_' . str_replace('prefix_', '', $key]);
}
0 голосов
/ 13 октября 2011

Вы уже перебираете ключи массива, поэтому, если у вас есть

$array = (
    'prefix_a' => 'b',
    'prefix_c' => 'd'
     etc...
)

, тогда $ keys будут prefix_a, prefix_c и т. Д. ... Что вы делаетегенерирует совершенно НОВЫЙ ключ, который будет prefix_prefix_a, prefix_prefix_c и т. д.

Если вы не делаете что-то более сложное, вы можете просто заменить весь цикл на

$array = array();
...