Многомерный массив словарь ключ / значение;возвращается из функции, нет управляющих структур - PullRequest
0 голосов
/ 28 марта 2012

Довольно просто; Мне просто любопытно, если есть лучший способ сделать это.

Учитывая массив следующим образом:
( результат preg_match_all() с PREG_SET_ORDER)

$matches = array(2) {
  [0]=>
  array(5) {
    [0]=>
    string(8) "key=foo;"
    ["key"]=>
    string(3) "key"
    [1]=>
    string(3) "key"
    ["value"]=>
    string(3) "foo"
    [2]=>
    string(3) "foo"
  }
  [1]=>
  array(5) {
    [0]=>
    string(12) "pattern=bar;"
    ["key"]=>
    string(7) "pattern"
    [1]=>
    string(7) "pattern"
    ["value"]=>
    string(3) "bar"
    [2]=>
    string(3) "bar"
  }
}

Я бы хотел извлечь в массив следующее:

array(2) {
  ["key"]=>
  string(3) "foo"
  ["pattern"]=>
  string(3) "bar"
}

По сути, создание ассоциативного массива $array[$i]['key'] => $array[$i]['value'] для каждого $i.
( Если это звучит странно, извините, уже поздно )

Во всяком случае, это тривиально; Тем не менее, я пытаюсь сделать это с помощью основных функций PHP array_*, которые возвращают полученный массив ( извините array_walk).

Нет foreach или другие циклические управляющие структуры.

Прямо сейчас, я понял это:

\array_combine(\array_map(function($match) {
        return (string) $match['key'];
    }, $matches), \array_map(function($match) {
        return (string) $match['value'];
    }, $matches))

Что работает, но не совсем кратко; Мне не нравится, когда array_map дважды - один раз для ключей, один раз для значений.

Существует ли более элегантное решение для извлечения вложенных значений из правильно сформированного многомерного массива в одномерный словарь пары ключ / значение?

1 Ответ

2 голосов
/ 28 марта 2012

С php v5.3 +:

из-за:

5.3.0 Изменено начальное значение для разрешения смешанного, ранее целого числа.

http://php.net/manual/en/function.array-reduce.php

$matches = array(
  array(
                'key=foo;',
    'key' =>    'key',
                'key',
    'value' =>  'foo',
                'foo',
  ),
  array(
                'pattern=bar;',
    'key' =>    'pattern',
                'pattern',
    'value' =>  'bar',
                'bar',
  ),
);

$a = array_reduce($matches, function ($b, $v) {
  return $b + array($v['key'] => $v['value']);
}, array());

print_r($a);

/*
Array
(
    [key] => foo
    [pattern] => bar
)
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...