从嵌套数组中提取数据

时间:2011-06-10 22:56:48

标签: php arrays multidimensional-array

我有以下数组(通过var_dump$results

array(4) { 
    [0]=> array(5) { 
        [0]=> array(1) { ["evtId"]=> string(1) "2" } 
        [1]=> array(1) { ["evtId"]=> string(1) "3" } 
        [2]=> array(1) { ["evtId"]=> string(1) "4" } 
        [3]=> array(1) { ["evtId"]=> string(1) "5" } 
        [4]=> array(1) { ["evtId"]=> string(1) "6" } 
    [1]=> array(5) { 
        [0]=> array(1) { ["evtLocation"]=> string(2) "11 St Paul" } 
        [1]=> array(1) { ["evtLocation"]=> string(5) "12412 Horace St" } 
        [2]=> array(1) { ["evtLocation"]=> string(14) "Friends Center" } 
        [3]=> array(1) { ["evtLocation"]=> string(14) "Friends Center" } 
        [4]=> array(1) { ["evtLocation"]=> string(14) "Friends Center" } 
    [2]=> array(5) { 
        [0]=> array(1) { ["evtDate"]=> string(1) "11/12/2011" } 
        [1]=> array(1) { ["evtDate"]=> string(1) "06/05/2012" } 
        [2]=> array(1) { ["evtDate"]=> string(1) "10/10/2010" } 
        [3]=> array(1) { ["evtDate"]=> string(1) "06/06/2012" } 
        [4]=> array(1) { ["evtDate"]=> string(1) "10/12/2012" } 
    [3]=> array(5) { 
        [0]=> array(1) { ["evtType"]=> string(4) "Fun" } 
        [1]=> array(1) { ["evtType"]=> string(6) "Random" } 
        [2]=> array(1) { ["evtType"]=> string(9) "Childcare" } 
        [3]=> array(1) { ["evtType"]=> string(9) "Childcare" } 
        [4]=> array(1) { ["evtType"]=> string(9) "Childcare" } 

我正在使用此数组将数据库信息提取到构建表的函数中。但是,我需要以下列格式结束:

$rows[] = array('2', '11 St Paul', '11/12/2011', 'Fun'); 

我真的只能做到这一点:

foreach ($events as $field_arr) {
  //this gives me 4 arrays, each array containing all of the records for one field type.
}

现在我需要遍历四个数组中的每一个,从同一个索引中取一个值并将其添加到$rows[]数组中,我可以将其传递给表构建函数。我尝试过以下的变体(在最初的foreach循环中)

 $x = count($result[0]); //this gives the number of fields
 for ($i = 0; $i < $x; $i++) {
    rows[$i] = $field_array[$i];
 }

我一直在尝试半天的变化,运气不佳(我最终得到的阵列包含我需要的4倍的元素,并且很难摆脱最终的数组键({{ 1}}等)。 如果有人能帮我指出正确的方向,我会非常感激。

6 个答案:

答案 0 :(得分:3)

这里发布的大多数代码看起来都很冗长,所以这里有一个简短的版本:

$rows = array();
foreach ($results as $pairs)
{
    foreach ($pairs as $rowNumber => $pair)
    {
        // current($pair) will give you the value
        // you could use key($pair) to get the key too
        $rows[$rowNumber][] = current($pair);
    }
}

这就是它。 $results的每个元素都包含key =&gt;值对的列表,我们只对每对的值感兴趣。该对的索引是行的索引,我们将其存储在$rowNumber中。我已经运行它,它似乎产生了预期的结果。

答案 1 :(得分:2)

可能是最短路:

$combined = array_map(function ($a, $b, $c, $d) { return $a + $b + $c + $d; }, $results[0], $results[1], $results[2], $results[3]);

或者,可自动扩展以容纳任意数量的结果元素:

$combined = call_user_func_array('array_map', array_merge(array(function () {
                $args = func_get_args();
                return call_user_func_array('array_merge', $args);
            }), $results));

两者都将每个数组节点的每个 nth 元素合并为一个新数组。

答案 2 :(得分:1)

假设数组总是正确的大小(而不是“锯齿状”)

$field_count = count($original);
$item_count = count($original[0]);

$items = array_fill(0,$item_count,array());

for($i = 0; $i < $item_count; $i++){
    for($j = 0; $j < $field_count; $j++){
        $inner = $original[$j][$i][0]; // Grab the innermost array
        $temp = array_values($inner); // Only take the values, discard "evtId" etc.
        // (PHP doesn't support array indices right after function call)
        $items[$i][] = $temp[0]; // Append value to item
    }
}

顺便说一句,您经常可以使用var_export(x,true)代替var_dump(x)来重新粘贴PHP。

答案 3 :(得分:1)

假设您的原始数组已分配给名为$data的变量:

$data = array(...);

$colCount = count($data);
$rowCount = $colCount > 0 ? count($data[0]) : 0;

$rows = array();
for ($r = 0; $r < $rowCount; $r++) {
    $record = array();
    for ($c = 0; $c < $colCount; $c++) {
        $key = key($data[$c][$r]);
        $value = $data[$c][$r][$key];
        $record[$key] = $value;
    }
    $rows[] = $record;
}

答案 4 :(得分:1)

尽管数据彼此堆叠,您需要从中获取数据。只是创建一个迭代而不是四个,因为您的数据结构也有四个级别:

foreach($original as $fieldIndex => $fields) { 
    foreach($fields as $valueIndex => $envelope) {
        foreach($envelope as $valueEntry) {
            foreach($valueEntry as $key => $value) {
                printf("%d - %d - %s: '%s'\n", $fieldIndex, $valueIndex, $key, $value);
                $build[$valueIndex][$key]=$value;
            }
        }
    }
}

var_dump($build);

我在里面放了一些输出,这样你就可以看到最里面收集了什么。这是收集所有数据的地方,您可以根据需要重新订购。

这仅适用于每个相应级别上始终具有相同数量的元素以获得良好形成的结果的情况。但是,代码示例在总是存在相同级别嵌套时已经起作用,因此并非每个项目都需要包含所有键。

编辑:从三级改为四级。

答案 5 :(得分:0)

这不是针对海报的,而是针对那些批评我说我没有测试我的代码的人。免责声明:我不是来为您撰写申请。我将尝试为您提供可用的代码,但我绝不保证这是拖放,即插即用或其他任何东西。如果您需要这种类型的服务,请聘请我自己或您在本网站上找到的许多其他称职的专业开发人员之一。

那就是说......这段代码应该让你朝着你需要去的方向前进,我已经测试了它,但不保证它能适用于你的特定阵列结构,但应该足以给你一个想法你需要做什么。

希望这有帮助!

foreach($events as $value1) {

 foreach($value1 as $value2) {

   $new_arr[] = array(
    'evtId' => $value2['evtId'],
    'evtLocation' =>$value2['evtLocation'],
    'evtDate' => $value2['evtDate'],
    'evtType' =>$value2['evtType']) ;
   }

}