Изменить массив в PHP, изменив структуру

1

У меня есть массив ниже:

$test = array(
    'key_a' => array('a', 'b'),
    'key_b' => array('c', 'd')
);

и я хочу преобразовать в следующем формате:

$test = array(
    array(
        'key_a' => 'a',
        'key_b' => 'c'
    ),
    array(
        'key_a' => 'b',
        'key_b' => 'd'
    )
);

Является ли это возможным? Как я могу это сделать?

  • 0
    Вы можете использовать $array = array_values($array); ....
Теги:
arrays

4 ответа

1
Лучший ответ

Я думаю, вы можете использовать что-то вроде следующего:

$test = array(
    'key_a' => array('a', 'b'),
    'key_b' => array('c', 'd')
);

$max_length = 0;
$data = array();

foreach($test as $key => $value) { //Find the max_length of all subarrays
    $this_length = count($value);
    if ($this_length > $max_length) {
        $max_length = $this_length;
    }
}

for($i = 0; $i < $max_length; $i++) { //For all subarray values (horizontal)
    foreach($test as $key => $value) { //Foreach array (vertical)
        if (isset($value[$i])) { //If the value is set 
            $data[$i][$key] = $value[$i];
        }
    }
}

var_dump($data);

Результат:

array (size=2)
  0 => 
    array (size=2)
      'key_a' => string 'a' (length=1)
      'key_b' => string 'c' (length=1)
  1 => 
    array (size=2)
      'key_a' => string 'b' (length=1)
      'key_b' => string 'd' (length=1)

Также работает для неравномерных массивов:

$test = array(
    'key_a' => array('a', 'b', 'M'),
    'key_b' => array('c', 'd',)
);

Результат:

array (size=3)
  0 => 
    array (size=2)
      'key_a' => string 'a' (length=1)
      'key_b' => string 'c' (length=1)
  1 => 
    array (size=2)
      'key_a' => string 'b' (length=1)
      'key_b' => string 'd' (length=1)
  2 => 
    array (size=1)
      'key_a' => string 'M' (length=1)
1

Одним из решений было бы:

$test = array(
    'key_a' => array('a', 'b'),
    'key_b' => array('c', 'd')
);

$result = array();    
foreach ($test as $arrays) {
    $result = array_merge_recursive(
        $result,
        array_combine(
            array_keys($test),
            array_chunk($arrays, 1)
        )
    );
}

foreach ($result as $key => &$value) {
    $value = array_combine(array_keys($test), $value);
}

echo '<pre>';
print_r($result);
echo '</pre>';

Результатом будет:

Array
(
    [key_a] => Array
        (
            [key_a] => a
            [key_b] => c
        )

    [key_b] => Array
        (
            [key_a] => b
            [key_b] => d
        )

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

Да, это возможно. Вы можете использовать array_values - эта функция возвращает все значения из массива и численно индексирует массив.

Попробуй это:

<?php

$test = array(
    'key_a' => array('a', 'b'),
    'key_b' => array('c', 'd')
);

$test = array_values($test);

echo '<pre>';
print_r( $test );
echo '</pre>';
0

Пройдите через свой массив и перестройте новый в одно и то же время.

function arrayTranspose($myArray) {
    $result = array();
    foreach ($myArray as $mainKey => $subArray) {
        foreach ($subArray as $subKey => $value) {
            if (!isset($result[$subKey])) 
                $result[$subKey] = array();
            $result[$subKey][$mainKey] = $value;
        }
    }
    return $result;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню