Массив имени ключа PHP - PullRequest
0 голосов
/ 25 марта 2010

У меня есть массив $ 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);

Не работает. Как я могу заставить это работать?

Кроме того, я хочу, чтобы все, что находится в ключах (не значения), было в нижнем регистре: есть ли простой способ сделать это тоже? Спасибо.

Ответы [ 4 ]

1 голос
/ 25 марта 2010

Вы имеете в виду, что хотите превратить ключи в отдельные массивы? Или вы имели в виду просто изменить ключи в том же массиве?

    $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'], так как мы добавили туда дополнительный вложенный массив.

0 голосов
/ 25 марта 2010

Во-первых, я бы не стал изменять массив ввода, но создавал бы новый, если у вас нет серьезных серьезных проблем с ограничением памяти.
И тогда вы не можете просто заменить ключ, чтобы добавить более глубокий вложенный уровень в массив. $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);
0 голосов
/ 25 марта 2010

Ваши требования звучат ... подозрительно. Возможно, вы имели в виду что-то вроде следующего:

$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);
0 голосов
/ 25 марта 2010

для начинающих

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

должно быть

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