php взорвалась проблема ассоциативного массива - PullRequest
3 голосов
/ 17 апреля 2011

У меня есть скрипт php, как показано ниже;

$ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34);

$ages2 = '"Peter"=>32, "Quagmire"=>30, "Joe"=>34';

$array = explode(",", $ages2);

echo $array["Peter"];

echo $ages["Peter"];

В этом случае echo $ages["Peter"]; работает хорошо, но echo $array["Peter"]; не работает. Кто-нибудь может решить эту проблему, пожалуйста ..

Заранее спасибо.

blasteralfred

Ответы [ 5 ]

4 голосов
/ 17 апреля 2011

Вам придется пройти два шага:

  • Во-первых, взорваться, используя ', ', в качестве разделителя; чтобы получить данные, такие как "Peter"=>32
  • И затем, для каждого значения, взорваться, используя '=>' в качестве разделителя, чтобы разделить имя и возраст
    • Конечно, удаляя двойные кавычки вокруг имени.


Например, вы можете использовать что-то вроде этого:

$result = array();

$ages2 = '"Peter"=>32, "Quagmire"=>30, "Joe"=>34';
foreach (explode(', ', $ages2) as $couple) {
    list ($name, $age) = explode('=>', $couple);
    $name = trim($name, '"');
    $result[$name] = $age;
}

var_dump($result);


И, выгрузив массив, вы получите следующий вывод:

array
  'Peter' => string '32' (length=2)
  'Quagmire' => string '30' (length=2)
  'Joe' => string '34' (length=2)

Что означает, что с помощью этого:

echo $result['Peter'];

Получил бы ты:

32
3 голосов
/ 17 апреля 2011

Конечно, это не работает.explode просто разделяет по заданному разделителю, но не создает ассоциативный массив.

0 голосов
/ 17 апреля 2011

$ ages2 не является массивом, поэтому то, что вы пытаетесь здесь, не сработает напрямую, но вы можете преобразовать строку с этой структурой в массив следующим образом:

$ages2 = '"Peter"=>32, "Quagmire"=>30, "Joe"=>34';

$items = explode(",", $ages2);
foreach ($items as $item) {
    list($key,$value) = explode('=>',$item);
    $key = str_replace('"','',trim($key)); // Remove quotes and trim whitespace.
    $array[$key] = (int)$value;
}

Если вы var_dump($ массив), у вас будет:

array(3) {
  ["Peter"]=>
  int(32)
  ["Quagmire"]=>
  int(30)
  ["Joe"]=>
  int(34)
}

Так что вы можете сделать это, как ожидалось, и получить 32 обратно:

echo $array['Peter']
0 голосов
/ 17 апреля 2011

Вам нужно будет создать массив самостоятельно, извлекая имя и возраст:

<?php
$array = array();
$ages2 = '"Peter"=>32, "Quagmire"=>30, "Joe"=>34';
foreach (explode(",", $ages2) as $element) {
    $parts = explode("=>", $element);

    if (count($parts) == 2) {
        $name = str_replace(array('"', ' '), '', $parts[0]);
        $age = (int) $parts[1];

        $array[$name] = $age;
    }   
}

print_r($array);
0 голосов
/ 17 апреля 2011

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

$array = eval('return array('.$ages2.');');

Но, конечно, это не рекомендуется, так как это может пойти не так во многих отношениях.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...