из одномерного в двумерный массив - PullRequest
0 голосов
/ 21 декабря 2010

У меня есть этот одномерный массив PHP:

  Array
    (
        [Female--N] => 11
        [Male--N] => 11
        [Humans--N] => 11
        [Adult--N] => 8
        [Adolescent--N] => 8
        [Reaction Time-physiology--N] => 6
        [Acoustic Stimulation-methods--N] => 6
        [Schizophrenia-genetics--Y] => 5
        [Motion Perception--N] => 3
    )

И я хочу новый массив из этого, который будет выглядеть (я думаю, что это двухмерный ..?):

Array
        (
            [Female][N] => 11
            [Male][N] => 11
            [Humans][N] => 11
            [Adult][N] => 8
            [Adolescent][N] => 8
            [Reaction Time-physiology][N] => 6
            [Acoustic Stimulation-methods][N] => 6
            [Schizophrenia-genetics][Y] => 5
            [Motion Perception][N] => 3
        )

Могу ли я использовать метод разделения на ключевых элементах?

Немного сложнее ... Мне также нужно разделить на отдельном подчеркивании '_', я сделал это, чтобы не перепутать столбцы ... Нопример ниже не делает работу правильно ...

$new_array = array();
foreach($MeshtagsArray as $key => $value) {
    $parts = explode('__', $key, 2);
    $parts2 = explode('_', $key, 2);
    $new_array[] = array(
        'discriptor' => $parts[0],
    'qualifier' => $parts2[1],
        'major' => $parts[1],
        '#occurence' => $value
    );

Таким образом, вывод должен быть примерно таким:

[0] => Array
        (
            [discriptor] => Female
            [qualifier] => 
            [major] => N
            [#occurence] => 11
........
[5] => Array
        (
            [discriptor] => Reaction Time
            [qualifier] => physiology
            [major] => N
            [#occurence] => 6

С уважением, Thijs

Ответы [ 3 ]

2 голосов
/ 21 декабря 2010

ОБНОВЛЕНО

$new_array = array();
foreach($old_array as $key => $value) {
    $parts1 = explode('--', $key, 2);
    $parts2 = explode('-', $parts1[0], 2);
    $new_array[] = array(
        'descriptor' => $parts2[0],
        'qualifier' => count($parts2) > 1 ? $parts2[1] : '',
        'major' => $parts1[1],
        '#occurence' => $value
    );
}

$new_array теперь будет многомерным массивом с числовым индексом. Каждый ключ верхнего уровня будет содержать ассоциативный массив необходимых вам элементов.

В будущем не стесняйтесь объяснять всю проблему с самого начала, чтобы мы могли лучше вам помочь!

Объяснение

По данным php.net :

массив взрыв (строка $ delimiter , строка $ string [, int $ limit ])

Возвращает массив строк, каждая из которых является подстрокой string , образованной путем разбиения ее на границы, образованные строкой delimiter .

Массив в вашей задаче ассоциативный; это ключи строки Это упрощает итерацию массива с помощью foreach и разбиение ключей на части. Я использую параметр limit, чтобы гарантировать, что будет не более двух частей.

Кроме того, поскольку один разделитель является удвоенной версией другого, мы должны сначала взорваться на двойном -- разделителе, а затем взорваться на одном - разделителе.

Технически, мы могли бы использовать один разнесение - без параметра предела - и один разделитель -. Тогда мы могли бы сделать вывод, какая часть элемента принадлежит где. Однако иногда нет qualifier. Чтобы обойти эту проблему, я использовал два разнесения и троичный оператор, который подсчитывает возвращенное количество элементов из второго разнесения.

0 голосов
/ 21 декабря 2010

Если вы разделяете на -- и хотите получить двумерный массив, попробуйте следующее.

foreach ($the_array as $key => $value) {
    // split key into new indexes
    $indexes = explode('--', $key);

    if (count($indexes) == 2) {
        // create new dimension and set value
        $the_array[$indexes[0]][$indexes[1]] = $value;

        // remove old index
        unset($the_array[$key]);
    }
}

Примечание: Преобразует исходный массив и гарантирует, что ключ содержит --

0 голосов
/ 21 декабря 2010

Попробуйте эту функцию:

function convertArray($array)
{
    $return = array();
    foreach ($array as $key=>$value)
    {
        $exploded = explode('--', $key);
        $return[$exploded[0]][$exploded[1]] = $value;
    }

    return $return;
}
...