Упорядочить массив в требуемой последовательности

#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:

Прочитайте ваше требование из комментариев, не упорядочивайте свой ассоциативный массив. Вместо этого сделайте более чистую вещь, такую как :

  1. Иметь целочисленный индекс для сопоставления ключей ассоциативного массива. например.

    $myIndexes = Массив(«Номер ссылки», «Название поставщика», «ИМЯ ПОЛУЧАТЕЛЯ» ….);

  2. 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']
);
  

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