#php #arrays
#php #массивы
Вопрос:
У меня есть массив
Array
(
[0] => Array
(
[COMPANY NAME] => 1
[LPO NUMBER] => PO1
[LPO DATE] => 2011-04-13 10:08:37
[LPO AMT] => 1000
[PENDING AMT] => 1000
[PRIORITY] => 1
[AMOUNT] => 200
[BENEFICIARY NAME] => Self
[PAYMENT AS] => 1
[VENDOR NAME] => 0
[FINAL PAYMENT] =>
[doc_id] => 2
[Vendor Name] => Dept. of Economic Development.
[Reference Number] => PR_XHA_210
[Pay Cheque Number] => N/A
[Paid] => 0
)
[1] => Array
(
[COMPANY NAME] => 1
[LPO NUMBER] => PO1
[LPO DATE] => 2011-04-13 10:08:37
[LPO AMT] => 1000
[PENDING AMT] => 800
[PRIORITY] => 1
[AMOUNT] => 800
[BENEFICIARY NAME] => Self
[PAYMENT AS] => 1
[VENDOR NAME] => 0
[FINAL PAYMENT] =>
[doc_id] => 3
[Vendor Name] => Dept. of Economic Development.
[Reference Number] => PR_XHA_211
[Pay Cheque Number] => N/A
[Paid] => 0
)
)
Мне нужно упорядочить массив в моей требуемой последовательности индексов, которая похожа
[0] => Array
(
[Reference Number] => PR_XHA_210
[Vendor Name] => Dept. of Economic Development.
[BENEFICIARY NAME] => Self
[LPO DATE] => 2011-04-13 10:08:37
[LPO NUMBER] => PO1
[LPO AMT] => 1000
[Paid] => 0
[AMOUNT] => 200
[doc_id] => 2
[doc_id] => 2
[Pay Cheque Number] => N/A
)
Как это можно сделать?
Пожалуйста, помогите…
Комментарии:
1. Упорядочить звучит странно, если только вы не используете
foreach
илиnext()
результирующий массив не кажется просто меньшим. Если вы игнорируете дубликат недопустимого ключаdoc_id
2. Просто любопытно … если вы используете ассоциативный массив, почему порядок ключей имеет значение? Тогда какой смысл вообще иметь ключи?
3. Мне нужно выполнить итерацию массива таким образом, чтобы каждое «<td>» получало свое значение, требуемое конкретное значение, например, здесь сначала «<td>» должно иметь «Ссылочный номер» в качестве первого значения
4. После прочтения комментариев я не совсем уверен, что правильно понял ваш вопрос. Извините, английский не мой родной язык.
5. @OmTheEternity Ок. Но, к вашему сведению, PHP несколько отличается тем, что он поддерживает ассоциативный порядок ключей массива. Порядок не гарантируется в аналогичных структурах в большинстве других языков.
Ответ №1:
Попробуйте это (непроверено):
$keys = array(
'Reference Number',
'Vendor Name',
...
);
$reordered = array();
foreach ($array as $item) {
$new_item = array();
foreach ($keys as $key) {
$new_item[$key] = $item[$key];
}
$reordered[] = $new_item;
}
Это создаст новый массив, $reordered
который содержит все ваши строки, с ключами, переупорядоченными в соответствии с порядком, определенным в $keys
.
В качестве альтернативы вы могли бы изменить порядок вашего массива на месте, используя uksort
и функцию обратного вызова (опять же, непроверенную).
function sort_keys($a, $b) {
static $keys = array(
'Reference Number',
'Vendor Name',
...
);
return array_search($a, $keys) - array_search($b, $keys);
}
foreach ($array as amp;$item) {
uksort($item, 'sort_keys');
}
Третий вариант — оставить ваш массив в покое, но отредактировать ваш код просмотра:
$keys = array(
'Reference Number',
'Vendor Name',
...
);
foreach ($array as $item) {
foreach ($keys as $key) {
printf('<tr><th>%s</th><td>%s</td></tr>',
htmlspecialchars($key),
htmlspecialchars($item[$key]));
}
}
Ответ №2:
Вы могли бы попытаться проявить смекалку, фактически отсортировав массив, но самый простой способ — просто воссоздать его:
$rearrangedArray = array(
'Reference Number' => $oldArray['Reference Number'],
'Vendor Name' => $oldArray['Vendor Name'],
...
);
Хотя это кажется очень бессмысленным. Либо ваш массив численно проиндексирован и упорядочен, либо вы используете ассоциативный массив. Требовать обоих просто странно.
Мне нужно выполнить итерацию массива таким образом, чтобы каждое «
<td>
» получало свое значение, требуемое конкретное значение, например, здесь первое «<td>
» должно иметь «Номер ссылки» в качестве первого значения
В этом случае вы должны просто создать свою таблицу явно так:
<tr>
<td>Reference Number:</td> <td><?php echo $array['Reference Number']; ?></td>
<td>Vendor Name:</td> <td><?php echo $array['Vendor Name']; ?></td>
...
</tr>
Комментарии:
1. Упорядоченные ассоциативные массивы совсем не странные в PHP. Вот почему существуют такие функции, как
ksort()
.2. @Sander Верно. Они не являются странными в PHP. Тот факт, что PHP беспокоится о поддержании порядка ключей, кажется странным, по сравнению с другими языками .
3. @Sander
ksort
полезен для сортировки значений с использованием ключей в качестве критерия, что не так уж и редко. Требование, чтобы нечисловые ключи располагались в определенном порядке, является несколько необычным. Я знаю, что оба они в основном одинаковы, но варианты использования совершенно разные.4. В Lisp есть списки, в Python и Java есть упорядоченные словари. В Perl есть индексированные хэши (как модуль). Все они представляют собой упорядоченные ассоциативные массивы (на самом деле, упорядоченные карты). Они довольно распространены.
Ответ №3:
Вы могли бы создавать функции, которые используют array_splice()
для изменения порядка элементов массива. Скорее всего, лучше просто перестроить массив так, как вы этого хотите, но просто для разнообразия ответов, вот это:
<?php
// $input (Array) - the array containing the element
// $index (int) - the index of the element you need to move
function moveUp($input,$index) {
$new_array = $input;
if((count($new_array)>$index) amp;amp; ($index>0)){
array_splice($new_array, $index-1, 0, $input[$index]);
array_splice($new_array, $index 1, 1);
}
return $new_array;
}
function moveDown($input,$index) {
$new_array = $input;
if(count($new_array)>$index) {
array_splice($new_array, $index 2, 0, $input[$index]);
array_splice($new_array, $index, 1);
}
return $new_array;
}
$input = array("red", "green", "blue", "yellow");
$newinput = moveUp($input, 2);
// $newinput is array("red", "blue", "green", "yellow")
$input = moveDown($newinput, 1);
// $input is array("red", "green", "blue", "yellow")
?>
Затем просто вызывайте эти функции в своем массиве, пока порядок не будет таким, как вам нравится.
Ответ №4:
Прочитайте ваше требование из комментариев, не упорядочивайте свой ассоциативный массив. Вместо этого сделайте более чистую вещь, такую как :
-
Иметь целочисленный индекс для сопоставления ключей ассоциативного массива. например.
$myIndexes = Массив(«Номер ссылки», «Название поставщика», «ИМЯ ПОЛУЧАТЕЛЯ» ….);
2.
for($i=0;$i< count($dataArray);$i )
{
$myCurrentKey = $myIndexes[$i];
$myCurrentData = $dataArray[$myCurrentKey];
echo "<td>".$myCurrentData."</td>";
}
При последовательной печати <td>
извлеките ключевое имя из $myIndexes, а затем извлеките значение из вашего массива данных.
Ответ №5:
поскольку ваш массив довольно длинный, я показываю его на более простом примере. Это $your_array:
Array
(
[0] => Array
(
[COMPANY NAME] => 1
[LPO NUMBER] => PO1
)
[0] => Array
(
[AMOUNT] => 200
[doc_id] => 2
)
)
соедините его со следующим кодом:
$together = array(
$your_array[1]['AMOUNT'],
$your_array[0]['COMPANY NAME'],
$your_array[0]['LPO NUMBER'],
$your_array[1]['doc_id']
);
Я надеюсь, что с этим примером в руках вы сможете заполнить остальное самостоятельно.