У меня есть некоторые ассоциативные массивы, которые хранят лексические данные для словаря. Ниже приведен пример структуры из массива называется $rowArray
:Значения массива не обновляются после foreach()
[2] => Array
(
[\lx] => gunu
[\np] => LH
[\ps] => noun
[\ge] => thick grass in the field, thicket
[\gn] => tshutlha
[\lt] =>
[\va] =>
[\cf] =>
[\ce] =>
[\nt] =>
[\oi] => gunu [LH] thick grass in the field, thicket (noun) (Sets. tshutlha)
)
[3] => Array
(
[\lx] => guru
[\np] => S
[\ps] => noun
[\ge] => ankle
[\gn] => lenyenyana
[\xv0] => ʔam guru-ŋǀı̃
[\xe0] => my ankles
[\lt] =>
[\va] =>
[\cf] =>
[\ce] =>
[\nt] =>
[\oi] => guru [S] ankle (noun) (Sets. lenyenyana) (ex. ʔam guru-ŋǀı̃ ‘my ankles’)
)
Я создаю таблицу, и мне нужно, чтобы создать строку заголовков эквивалентно ключей в массиве выше (например, заголовки будут в \ лк \ np \ ps ...) Я сохраняю эти значения в отдельном массиве с именем $headArray
.
Проблема в том, что некоторые массивы имеют больше значений, чем другие, поэтому, когда я создаю таблицу, столбцы смещены. Например, в приведенном выше [2]
имеется 11 значений, но в [3]
выше 13 значений. Таким образом, в электронной таблице столбцы не совпадают точно.
Поэтому я первый переборе всех ключей от $rowArray
для заполнения $headArray
(таким образом, он всегда будет иметь максимально возможное количество товарных позиций возможных):
$headArray = array();
foreach($rowArray as $j=>$rA){
foreach($rA as $r=>$a){
if(!in_array($r, $headArray)){
$pos = array_search($r, array_keys($rA));
array_splice($headArray, $pos, 0, $r);
}
}
}
Вывод этого кода является массив со всеми возможными заголовками в правильном порядке:
Array
(
[0] => \lx
[1] => \np
[2] => \ps
[3] => \ge
[4] => \gn
[5] => \xv0
[6] => \xe0
[7] => \xv1
[8] => \xe1
[9] => \lt
[10] => \va
[11] => \cf
[12] => \ce
[13] => \nt
[14] => \oi
)
А потом я использую этот список ($headArray
) для перебора всех записей в $rowArray
- если запись в $rowArray
отсутствует ключ, который $headArray
имеет, затем я вставляю его и делаю пустым. Фактически, я создаю пустые столбцы в своей таблице, чтобы все выравнивало независимо от того, что. Для этой итерации, я использую этот код:
foreach($rowArray as $j=>$rA){
if(count($rA) < count($headArray)){
$rA_keys = array_keys($rA);
$rA_diff = array_diff($headArray, $rA_keys);
foreach($rA_diff as $di=>$ff){
if(!array_key_exists($ff, $rA)){
$rA = array_slice($rA, 0, $di, true) + array($ff => '') + array_slice($rA, $di, NULL, true);
}
}
}
}
Вывода этого кода следующим образом (сравните с первым массивом в этом посте):
Array
(
[\lx] => gunu
[\np] => LH
[\ps] => noun
[\ge] => thick grass in the field, thicket
[\gn] => tshutlha
[\xv0] =>
[\xe0] =>
[\xv1] =>
[\xe1] =>
[\lt] =>
[\va] =>
[\cf] =>
[\ce] =>
[\nt] =>
[\oi] => gunu [LH] thick grass in the field, thicket (noun) (Sets. tshutlha)
)
Array
(
[\lx] => guru
[\np] => S
[\ps] => noun
[\ge] => ankle
[\gn] => lenyenyana
[\xv0] => ʔam guru-ŋǀı̃
[\xe0] => my ankles
[\xv1] =>
[\xe1] =>
[\lt] =>
[\va] =>
[\cf] =>
[\ce] =>
[\nt] =>
[\oi] => guru [S] ankle (noun) (Sets. lenyenyana) (ex. ʔam guru-ŋǀı̃ ‘my ankles’)
)
Он работает, я думаю! Таким образом, при всем этом фоне знания в виду, мои вопросы:
1. Вне этих foreach
петель, даже если результаты print()
правильно, массивы не обновляются. Например, когда я пытаюсь записать массивы в свою электронную таблицу, обновленные значения с помощью сплайсинга и всего этого материала НЕ сохраняются. Итак, как я могу сделать так, чтобы массивы обновлялись в моих петлях foreach
?
2. Есть ли логически более эффективный или лучший способ делать то, что я делаю? Эта задача дала мне головную боль в течение 4 дней, и я не уверен, что мой метод является лучшим!
^^ Это то, что вы ищете. –