@voldant

Как распарсить массив?

Как получить из массива:

$a = [
'color' => ['red', 'blue'],
'size' => ['10-12', '12-14']
];

такой массив

$b = [
['color' => 'red', 'size' => '10-12'],
['color' => 'blue', 'size' => '10-12'],
['color' => 'red', 'size' => '12-14'],
['color' => 'blue', 'size' => '12-14'],
];

ключей и значений может быть любое кол-во, имена ключей и значений могут быть разные
  • Вопрос задан
  • 203 просмотра
Решения вопроса 2
mhthnz
@mhthnz
PHP, YII2, Golang, Linux
<?php
$a = [
'color' => ['red', 'blue', 'orange'],
'size' => ['10-12', '12-14', '13-13'],
'somekey' => ['val1', 'val2', 'val3'],
];

function addValue(&$arr, $key, $val)
{
	if (!count($arr)) {
		$arr[] = [$key => $val];
		return;
	}
	foreach($arr as $num => $values) {
		$arr[$num][$key] = $val;	
	}
	
}

$b = [];

foreach($a as $key => $values) {
	
	$copyB = $b;
	$newB = [];
	foreach($values as $value) {
		$currentB = $copyB;
		addValue($currentB, $key, $value);
		$newB = array_merge($newB, $currentB);
	}
	$b = $newB;
	
}

print_r($b);
Ответ написан
Minifets
@Minifets
Hello world!!!
function crossJoin($array)
{
    $result     = [];
    $current    = array_splice($array, -1);

    foreach ($current as $key => $values) {
        foreach ((array) $values as $value) {
            if (empty($array)) {
                array_push($result, [$key => $value]);
            } else {
                foreach (crossJoin($array) as $temp) {
                    array_push($result, array_merge([$key => $value], $temp));
                }
            }
        }
    }

    return $result;
}

crossJoin($a);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
$b = [];
foreach($a['color'] as $color){
   foreach($a['size'] as $size){
      $b[] = ['color'=>$color,'size'=>$size];
   }
}
print_r($b);
Ответ написан
@egormmm
Борітеся — поборете!
$b = [];
foreach ($a as $key => $values) {
  $i = 0;
  while($values){
    $b[$i][$key] = array_pop($values);
    $i++;
  }
}

var_dump($b);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы