Объединить три многомерных массива разной длины - PullRequest
0 голосов
/ 30 августа 2018

У меня есть небольшая проблема для объединения 3-х многомерного массива разной длины без дублирующегося ключа в один массив, как это:

Мои 3 массива:

$volume380 = array {
array {
    "DATE" => "2018-07-30"
    "VOLUME380" => 813.0
}
    array {
    "DATE" => "2018-07-31"
    "VOLUME380" => 1188.0
}

    array {
    "DATE" => "2018-08-01"
    "VOLUME380" => 1081.0
}

    array {
    "DATE" => "2018-08-02"
    "VOLUME380" => 886.0
}
}

$volume320 = array {
array {
    "DATE" => "2018-07-30"
    "VOLUME320" => 813.0
}
    array {
    "DATE" => "2018-07-31"
    "VOLUME320" => 1188.0
}

    array {
    "DATE" => "2018-08-02"
    "VOLUME320" => 1081.0
}
}

$volume800 = array {
array {
    "DATE" => "2018-07-30"
    "VOLUME800" => 813.0
}
    array {
    "DATE" => "2018-07-31"
    "VOLUME800" => 1188.0
}

    array {
    "DATE" => "2018-08-01"
    "VOLUME800" => 1081.0
}

    array {
    "DATE" => "2018-08-02"
    "VOLUME800" => 886.0
}
}

Результат, который я хочу:

$volumeTot = array {
array {
    "DATE" => "2018-07-30"
    "VOLUME380" => 813.0
    "VOLUME320" => 813.0
    "VOLUME800" => 813.0
}
    array {
    "DATE" => "2018-07-31"
    "VOLUME380" => 1188.0
    "VOLUME320" => 1188.0
    "VOLUME800" => 1188.0
}

    array {
    "DATE" => "2018-08-01"
    "VOLUME380" => 1081.0
    "VOLUME800" => 1081.0
}

    array {
    "DATE" => "2018-08-02"
    "VOLUME380" => 886.0
    "VOLUME320" => 1081.0
    "VOLUME800" => 886.0
}
}

Я попробовал другой способ выяснить это, но из-за разной длины массива я немного застрял с этим.

Я пытался использовать цикл for и объединение массивов, но он не выполняет то, что я хочу.

Спасибо за помощь.

1 Ответ

0 голосов
/ 30 августа 2018

При просмотре ваших данных кажется, что «ДАТА» сама по себе является «ключом». Учитывая эту логику, функция «array_indexer» преобразует существующую точку данных, скажем, как $ volume380, в индексированный массив, используя «DATE» в качестве ключа для массива. Вторая функция «array_deindexer» создана для возврата формата массива к тому, в котором отображаются ваши исходные данные.

Объединение происходит внутри функции "array_combiner", которая "индексирует" как данный новый массив, так и накопленный массив, а затем объединяет общие ключи (как в значении "DATE").

Полный код указан ниже:

$volume380 = array (
    array (
        "DATE" => "2018-07-30",
        "VOLUME380" => 813.0
    ),
        array (
        "DATE" => "2018-07-31",
        "VOLUME380" => 1188.0
    ),
    array (
        "DATE" => "2018-08-01",
        "VOLUME380" => 1081.0
    ),
    array (
        "DATE" => "2018-08-02",
        "VOLUME380" => 886.0
    )
);

$array_final = array_combiner($volume380);

$volume320 = array (
    array (
        "DATE" => "2018-07-30",
        "VOLUME320" => 813.0
    ),
        array (
        "DATE" => "2018-07-31",
        "VOLUME320" => 1188.0
    ),
    array (
        "DATE" => "2018-08-02",
        "VOLUME320" => 1081.0
    )
);

$array_final = array_combiner($volume320);

$volume800 = array (
    array (
        "DATE" => "2018-07-30",
        "VOLUME800" => 813.0
    ),
    array (
        "DATE" => "2018-07-31",
        "VOLUME800" => 1188.0
    ),
    array (
        "DATE" => "2018-08-01",
        "VOLUME800" => 1081.0
    ),
    array (
        "DATE" => "2018-08-02",
        "VOLUME800" => 886.0
    )
);

$array_final = array_combiner($volume800);

print_r($array_final);

function array_combiner($array_tmp) {
    global $array_final;
    $array_tmp = array_indexer($array_tmp);
    $tmp = array();
    if (count($array_final) > 0)  {
        $tmp = array_indexer($array_final);
        foreach ($array_tmp as $k1 => $v1) {
            if (!isset($tmp[$k1])) $tmp[$k1] = array();
            foreach ($v1 as $k2 => $v2) {
                $tmp[$k1][$k2] = $v2;
            }
        }
    } else $tmp = $array_tmp;
    return array_deindexer($tmp);
}

function array_indexer($array_tmp) {
    $tmp = array();
    foreach ($array_tmp as $k1 => $v1) {
        $index = "";
        $data = array();
        foreach ($v1 as $k2 => $v2) {
            if ($k2 == "DATE") $index = $v2;
            else $data[$k2] = $v2;
        }
        if (strlen($index) > 0) $tmp[$index] = $data;
    }
    return $tmp;
}

function array_deindexer($array_tmp) {
    $tmp = array();
    $i = 0;
    foreach ($array_tmp as $k1 => $v1) {
        $tmp[$i]["DATE"] = $k1;
        foreach ($v1 as $k2 => $v2) $tmp[$i][$k2] = $v2;
        $i++;
    }
    return $tmp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...