php从另一个多维数组中修改一个多维数组

时间:2014-12-13 14:01:57

标签: php arrays

我是非常新的PHP&想在多维阵列下进行改造。这些数组我从JSON提交的表格中获得了许多名称' &安培; '值'但我需要散布一些价值观。在这里,我只给出了一个类似于我的工作的例子。

$formValues = array(
    array(
        'name' => 'name-agent-1',
        'value' => 'austin'
    ),
    array(
        'name' => 'company-agent-1',
        'value' => 'Samsung'
    ),
    array(
        'name' => 'phone-agent-1',
        'value' => '889410'
    ),
    array(
        'name' => 'mail-agent-1',
        'value' => 'abc@mail.com'
    ),
    array(
        'name' => 'name-agent-2',
        'value' => 'Justin'
    ),
    array(
        'name' => 'company-agent-2',
        'value' => 'Nokia'
    ),
    array(
        'name' => 'phone-agent-2',
        'value' => '332100'
    ),
    array(
        'name' => 'mail-agent-2',
        'value' => 'xyz@mail.com'
    ),
    array(
        'name' => 'name-agent-3',
        'value' => 'stefen'
    ),
    array(
        'name' => 'company-agent-3',
        'value' => 'Motorolla'
    ),
    array(
        'name' => 'phone-agent-3',
        'value' => '8744520'
    ),
    array(
        'name' => 'mail-agent-3',
        'value' => 'tyu@mail.com'
    )
);

从上面的多维数组示例中,我想重新构建以下格式:

Array
  (
   [1] => Array
       (
        [name-agent-1] => austin
        [company-agent-1] => Samsung
        [phone-agent-1] => 889410
        [mail-agent-1] => abc@mail.com
    )
  [2] => Array
    (
        [name-agent-2] => Justin
        [company-agent-2] => Nokia
        [phone-agent-2] => 332100
        [mail-agent-2] => xyz@mail.com
    )
  [3] => Array
    (
        [name-agent-3] => stefen
        [company-agent-3] => Motorolla
        [phone-agent-3] => 8744520
        [mail-agent-3] => tyu@mail.com
    )
)

我需要你最短的和最短的实现这一目标的最简单方法。请帮助和赞赏有意义的建议。  提前谢谢。

2 个答案:

答案 0 :(得分:0)

一种可能的方法:

$mapped = array();
$group = 0; // assuming you indeed have to start indexing with 1, as in the question
foreach ($formValues as $i => $arr) {
  if ($i % 4 === 0) {
    $group++;
  }
  $mapped[$group][ $arr['name'] ] = $arr['value'];
}

Demo。这里没有什么真正复杂的:使用foreach,您遍历源数组,使用键和值填充$mapped一个,相应地从namevalue获取。而且你有另一个属性 - $no - 用于将这些元素分组为4。


在上面的代码中,我假设源数组总是具有相同的结构。如果不是,你将不得不在循环中进行额外的检查,从name中提取组号:

$mapped = array();
foreach ($formValues as $arr) {
  $name = $arr['name'];
  if (preg_match('/(?<=-)\d+$/', $name, $m)) {
    $mapped[ $m[0] ][$name] = $arr['value'];
  }
}

答案 1 :(得分:0)

试试这个:

$out = array_reduce(
    $formValues,
    function (array $carry, array $item) {
        $name = $item['name'];
        $id   = end(explode('-', $name));
        if (! isset($carry[$id])) {
            $carry[$id] = array();
        }
        $carry[$id][$name] = $item['value'];
        return $carry;
    },
    array()
);

print_r($out);

代码使用'name'作为分隔符,按'-'的最后一个组件对输入值进行分组。输入值可以是任何顺序,其中一些可能丢失,并且没有请求拥有所有组的所有值。例如,如果缺少mail-agent-2,则代码仍然有效,并按其ID正确分组其余值。