iproger
@iproger
Безответственный гений

Как лучше изменить структуру массива в php?

Как наиболее элегантно преобразовать массив вида:
[data] => Array
(
    [1] => Array
        (
            [text] => Array
                (
                    [0] => link1
                    [1] => link2
                )

            [active] => Array
                (
                    [0] => 1
                    [1] => 1
                )

            [id] => Array
                (
                    [0] => 0
                    [1] => 0
                )
        )
)

в массив вида:
[data] => Array
(
    [1] => Array
        (
            [0] => Array
                (
                    [text] => link1
                    [active] => 1
                    [id] => 0
                )
            [1] => Array
                (
                    [text] => link2
                    [active] => 1
                    [id] => 0
                )
        )
)


Часть уже придумал:
$keys = array();
foreach ($data as $item) {
	$keys = array_fill_keys(array_keys($item),(object)array());
	// ...
}
  • Вопрос задан
  • 2798 просмотров
Решения вопроса 3
Tyranron
@Tyranron
function zip($tuple_of_lists)
{
    $list_of_tuples = array();
    foreach($tuple_of_lists as $key => $list) {
        foreach($list as $i => $value) {
            $list_of_tuples[$i][$key] = $value;
        }
    }
    return $list_of_tuples;
}

$data = array_map('zip', $data);

Try here
Ответ написан
iproger
@iproger Автор вопроса
Безответственный гений
Получилось вот что:
$result = array_fill_keys(array_keys($data),array());
foreach ($data as $data_key => $data_item) {
	foreach ($data_item as $key => $values) {
		foreach ($values as $value_key => $value_val) {
			if (!isset($result[$data_key][$value_key])) {
				$result[$data_key][$value_key] = (object)array();
			}
			$result[$data_key][$value_key]->$key = $value_val;
		}
	}
}
Ответ написан
Комментировать
nazarpc
@nazarpc
Open Source enthusiast
Попробуйте такой вариант:
$data	= array_map(
	function ($data) {
		$result	= [];
		foreach ($data as $field => $values) {
			foreach ($values as $index => $value) {
				if (!isset($result[$index])) {
					$result[$index] = [];
				}
				$result[$index][$field]	= $value;
			}
		}
		return $result;
	},
	$data
);

Просто и без излишеств, должен нормально обрабатывать неодинаковое количество элементов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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