Связывание данных в многомерном массиве в PHP - PullRequest
1 голос
/ 11 октября 2011

Спасибо за любую помощь.Это меня поставило в тупик.Начнем с этого:

Array
(
[numCols] => 8
[timePointLabel1] => Week1
[timePointLabel4] => Week2
[timePointLabel7] => Week3
[0] => Array
    (
        [Location0_name] => Name1
        [colText01] => 2
        [colText07] => 4
    )
[1] => Array
    (
        [Location1_name] => Name2
        [colText11] => 9
        [colText14] => 7
    )
)

Я хочу, чтобы номера NNN в timePointLabelsNNN шли в числовом порядке, начиная с 0. В настоящее время номера NNN равны 1, 4, 7.

У нас также естьмассив в массиве.N в полях colTextN относятся к меткам времени.Например, timePointLabel4 связан с colText04, colText14 и любым другим colText, который заканчивается одной цифрой 4.

Я выяснил, как динамически изменить порядок NNN, и поэтому я получаю это:

Array
(
[numCols] => 8
[timePointLabel0] => Week1
[timePointLabel1] => Week2
[timePointLabel2] => Week3
[0] => Array
    (
        [Location0_name] => Name1
        [colText01] => 2
        [colText07] => 4
    )
[1] => Array
    (
        [Location1_name] => Name2
        [colText11] => 9
        [colText14] => 7
    )
)

См. NNNs в timePointLabelNNNs теперь 0, 1, 2.

Как я это сделал?С этим кодом:

$timePointLabelCount = preg_grep("/^timePointLabel(\d)+$/",array_keys($this->data));

// go through the time point label array and create a new array to use
// it is assigned the correct order of keys, starting with 0 (since arrays start with 0 anyway)
foreach ($timePointLabelCount as $timePointCustom) {
    $timePointCustomArray[] = $this->data[$timePointCustom];
    unset($this->data[$timePointCustom]);
}

$timePointNum = 0;
// insert the correct timepoint data, in the correct order, into the array
foreach ($timePointCustomArray as $setTimePointData) {
    $this->data['timePointLabel' . $timePointNum] = $setTimePointData;
    $timePointNum++;
}

Но colTexts по-прежнему проблема.Для значений N в colTextN все, что равно 1, теперь должно быть 0, 4 - 1, а 7 - 2.

Так что я хочу, чтобы мой окончательный массив выглядел следующим образом:

Array
(
[numCols] => 8
[timePointLabel0] => Week1
[timePointLabel1] => Week2
[timePointLabel2] => Week3
[0] => Array
    (
        [Location0_name] => Name1
        [colText00] => 2
        [colText02] => 4
    )
[1] => Array
    (
        [Location1_name] => Name2
        [colText10] => 9
        [colText11] => 7
    )
)

Я подозреваю, что это потребует некоторого умного использования цикла foreach.

1 Ответ

0 голосов
/ 11 октября 2011

Вы не можете переименовывать ключи без искажения порядка в том же массиве, но вы можете создать новый массив (и позже сбросить предыдущий):

$i = 0;
$search = 'timePointLabel';
$reordered = array();
foreach($array as $key => &$value)
{
   if (0 === strpos($key, $search))
   {
       $key = $search . $i++;
   }
   $reordered[$key] =& $value;
}
unset($value);
$array = &$reordered;
unset($reordered);
print_r($array);

Демо

Редактировать: Чтобы решить эту проблему для подключей, необходимо получить сопоставление цифр и применить их к подмассиву таким же образом. Принцип фактически идентичен + с использованием карты:

$i = 0;
$search = 'timePointLabel';
$subsearch = 'colText';
$reordered = array();
$map = array();
foreach($array as $key => &$value)
{
   if (0 === strpos($key, $search))
   {
        $digit = NULL;
        sscanf($key, $search.'%d', $digit);
        if (NULL === $digit || $digit > 9) throw new Exception(sprintf('Invalid Key %d.', $key));
        $map[$digit] = $i;
        $key = $search . $i++;
   }
   elseif (is_int($key) && is_array($value))
   {
        $subreordered = array();
        foreach($value as $subkey => &$subvalue)
        {
            if (0 === strpos($subkey, $subsearch))
            {
                $lastPos = strlen($subkey)-1;
                $last = $subkey[$lastPos];
                if (isset($map[$last]))
                {
                    $subkey[$lastPos] = $map[$last];
                }
            }
            $subreordered[$subkey] = &$subvalue;
        }
        unset($subvalue);
        $value =& $subreordered;
        unset($subreordered);
   }
   $reordered[$key] =& $value;
}
unset($value);
unset($map);
$array = &$reordered;
unset($reordered);
print_r($array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...