Объединение значений массива PHP на основе начала строки - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть многомерный массив PHP, выглядящий так:

[14]=>
  array(2) {
    [0]=>
    int(29)
    [1]=>
    int(129)
  }

[193]=>
  array(3) {
    [0]=>
    int(6009231)
    [1]=>
    int(6324415)
    [2]=>
    int(5682922)
  }

РЕДАКТИРОВАТЬ: может быть более 2 ключей (здесь 14 и 193). Может быть n ключей.

Моя цель - получить следующие строки в новом массиве:

14:29;193:6009231
14:29;193:6324415
14:29;193:5682922
14:129;193:6009231
14:129;193:6324415
14:129;193:5682922

При условии, что ключ, значения разделены : иэлементы разделены ; Первый элемент всегда должен быть первым ключом (14), тогда мы пройдемся по значениям этого первого ключа. Второй элемент всегда является вторым ключом, и мы снова просматриваем значения второго элемента. РЕДАКТИРОВАТЬ: ключи всегда сортируются по возрастанию

Мне удается получить все возможные комбинации ключ: значения в нужном формате следующим образом:

$properties_values_combinations = []
foreach ($myarray as $property) {
    foreach ($property as $value) {
        $properties_values_combinations[] = (string)$property.":".(string)$value;
    }
}

Однако, как я могу комбинировать элементы этого массива в соответствии ск результату, которого я хочу достичь?

1 Ответ

2 голосов
/ 01 ноября 2019

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

$result = array();
list($k1, $k2) = array_keys($myArray);
foreach ($myArray[$k1] as $v1) {
    foreach ($myArray[$k2] as $v2) {
        $result[] = "$k1:$v1;$k2:$v2";
    }
}
print_r($result);

Вывод:

Array
(
    [0] => 14:29;193:6009231
    [1] => 14:29;193:6324415
    [2] => 14:29;193:5682922
    [3] => 14:129;193:6009231
    [4] => 14:129;193:6324415
    [5] => 14:129;193:5682922
)

Демонстрация на 3v4l.org

Обновление

Если может быть более 2 подмассивов, проблему необходимо решить с помощью рекурсии. Эта функция будет делать то, что вы хотите:

function list_values($array) {
    $output = array();
    $k1 = array_keys($array)[0];
    if (count($array) == 1) {
        foreach ($array[$k1] as $v1) {
            $output[] = "$k1:$v1";
        }
    }
    else {
        foreach ($array[$k1] as $v1) {
            foreach (list_values(array_slice($array, 1, null, true)) as $k2v2) {
                $output[] = "$k1:$v1;$k2v2";
            }
        }
    }
    return $output;
}

Демонстрация с массивом из 4 записей в 3v4l.org . Вывод слишком длинный, чтобы показать здесь.

...