Преобразование массива в меньшие массивы - PullRequest
0 голосов
/ 12 июля 2011

Я ломал голову над этой проблемой весь день. Как я могу преобразовать следующий массив:

Array
(
[0] => Array
    (
        [compId] => 3081
        [category] => Products
        [rev] => 0.61
    )

[1] => Array
    (
        [compId] => 3080
        [category] => Plants
        [rev] => 51
    )

[2] => Array
    (
        [compId] => 3080
        [category] => Products
        [rev] => 6.1
    )
)

В массив с этим форматом:

Array( 
'compId'=>array("3081","3080"), 
'Products'=>array('0.61', '6.1'), 
'Plants'=>array('0', '51')
);

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

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

CompID | Products | Plants
__________________________
3081   | 0.61     | 0
__________________________
3080   | 6.1      | 51

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Если я понимаю желаемый результат:

$result = array();

foreach ( $array as $item ) {
    $result['compId'][] = $item['compId'];
    $result[$item['category']][] = $item['rev'];
}

print_r($result);
0 голосов
/ 12 июля 2011
$categories = array_unique(array_map(function ($elem) { return $elem['category']; }, $array));
$tableRows = array('compId' => array_values(array_unique(array_map(function ($elem) { return $elem['compId']; }, $array))));

foreach ($tableRows['compId'] as $i => $compId) {
    foreach ($categories as $category) {
        $tableRows[$category][$i] = 0;
        foreach ($array as $elem) {
            if ($elem['category'] == $category && $elem['compId'] == $compId) {
                $tableRows[$category][$i] = $elem['rev'];
                break;
            }
        }
    }
}

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

0 голосов
/ 12 июля 2011

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

foreach ( $array as $item )
    foreach( $item as $key => $value)
        $result[$key][] = $value
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...