Перемещение многомерных массивов в PHP

Вы можете попробовать ниже -

select Date1, Date2, Date3, details as OtherDetails from details 
where Date1 <= 'asAtDate' and 
(
  (Date3 > DATEADD(DD,1,'asAtDate') or Date3 is null) and 
  (Date2 > DATEADD(DD,1,'asAtDate') or Date2 is null)
)
68
задан dreftymac 3 August 2018 в 19:12
поделиться

4 ответа

With 2 loops.

function flipDiagonally($arr) {
    $out = array();
    foreach ($arr as $key => $subarr) {
        foreach ($subarr as $subkey => $subvalue) {
            $out[$subkey][$key] = $subvalue;
        }
    }
    return $out;
}
62
ответ дан 24 November 2019 в 13:57
поделиться

I think you're referring to the array transpose (columns become rows, rows become columns).

Here is a function that does it for you (source):

function array_transpose($array, $selectKey = false) {
    if (!is_array($array)) return false;
    $return = array();
    foreach($array as $key => $value) {
        if (!is_array($value)) return $array;
        if ($selectKey) {
            if (isset($value[$selectKey])) $return[] = $value[$selectKey];
        } else {
            foreach ($value as $key2 => $value2) {
                $return[$key2][$key] = $value2;
            }
        }
    }
    return $return;
} 
8
ответ дан 24 November 2019 в 13:57
поделиться

Транспонирование N-мерного массива:

function transpose($array, &$out, $indices = array())
{
    if (is_array($array))
    {
        foreach ($array as $key => $val)
        {
            //push onto the stack of indices
            $temp = $indices;
            $temp[] = $key;
            transpose($val, $out, $temp);
        }
    }
    else
    {
        //go through the stack in reverse - make the new array
        $ref = &$out;
        foreach (array_reverse($indices) as $idx)
            $ref = &$ref[$idx];
        $ref = $array;
    }
}

$foo[1][2][3][3][3] = 'a';
$foo[4][5][6][5][5] = 'b';

$out = array();
transpose($foo, $out);

echo $out[3][3][3][2][1] . ' ' . $out[5][5][6][5][4];

Действительно хакерское и, вероятно, не лучшее решение, но эй, оно работает.

По сути, оно рекурсивно перебирает массив, накапливая текущие значения в массив.
Как только он достигает ссылочного значения, он берет «стек» индексов и переворачивает его, помещая в массив $ out. (Есть ли способ избежать использования массива $ temp?)

2
ответ дан 24 November 2019 в 13:57
поделиться
function transpose($array) {
    array_unshift($array, null);
    return call_user_func_array('array_map', $array);
}

Или, если вы используете PHP 5.6 или более позднюю версию:

function transpose($array) {
    return array_map(null, ...$array);
}
242
ответ дан 24 November 2019 в 13:57
поделиться
Другие вопросы по тегам:

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