Извлекать данные из вложенных массивов - PullRequest
2 голосов
/ 11 июня 2011

У меня есть следующий массив (через 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 раза больше элементов, чем мне нужно, и мне было трудно избавиться от окончательных ключей массива (['evtType'] так далее). Если кто-нибудь может помочь мне направить меня в правильном направлении, я буду очень признателен.

Ответы [ 6 ]

3 голосов
/ 11 июня 2011

Большая часть кода, размещенного здесь, кажется довольно многословной, поэтому вот короткая версия:

$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 содержит список пар ключ => значение, и нас интересует только значение каждой пары.Индекс пары - это индекс строки, которую мы храним в $rowNumber.Я запустил его, и, похоже, он дает ожидаемые результаты.

2 голосов
/ 11 июня 2011

Вероятно, самый короткий путь:

$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));

Оба объединяют каждый n-й элемент каждого узла массива в новый массив.

1 голос
/ 11 июня 2011

Столько, сколько данных друг на друга сложено, вам нужно извлечь из них. Просто не только создайте одну итерацию, но и четыре, так как ваша структура данных также имеет четыре уровня:

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);

Я поместил некоторые выходные данные там, чтобы вы могли видеть, что было собрано в самой внутренней части. Это место, где собираются все данные, и вы можете переупорядочить их в соответствии с вашими потребностями.

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

Редактировать: исправлено с трех до четырех уровней.

1 голос
/ 11 июня 2011

Если исходный массив назначен переменной с именем $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;
}
1 голос
/ 11 июня 2011

Предполагая, что массив всегда имеет правильные размеры (а не "зубчатые")

$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.

0 голосов
/ 11 июня 2011

Это не предназначено для автора, но для тех, кто критикует меня за то, что я не проверял свой код.ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не здесь, чтобы написать ваше заявление для вас.Я попытаюсь предоставить вам пригодный для использования код, но я ни в коем случае не гарантирую, что это перетаскиваемый объект, подключи и работай или что-либо еще.Если вам нужен такой тип услуг, то, пожалуйста, наймите меня или одного из многих других компетентных профессиональных разработчиков, которых вы найдете на этом сайте.

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

Надеюсь, это поможет!

foreach($events as $value1) {

 foreach($value1 as $value2) {

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

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