За последние 24 часа нас посетили 70847 программистов и 10291 робот. Сейчас ищут 3358 программистов ...

При изменении массива меняется порядок элментов

Тема в разделе "PHP для новичков", создана пользователем Volonter, 8 июн 2023.

Метки:
  1. Volonter

    Volonter Активный пользователь

    С нами с:
    8 авг 2009
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Москва
    Всем привет, знаю что при изменении массива может поменяться порядок элементов в нем, но как победить? Суть в следующем, я беру исходный массив, прогоняю его в foreach, проверяю в нем наличие элементов, и если их нет - добавляю.
    Выглядит так:
    PHP:
    1. <?php
    2. // Исходный массив
    3. foreach ($dealers as $key => $article){
    4.     $data[$key]['title'] = $article[0]->art_title;
    5.     foreach ($article as $art){
    6.         if($art->field_id == 1){
    7.             $data[$key]['region'] = $art->value;
    8.         }
    9.  
    10.         if($art->field_id == 2){
    11.             $data[$key]['city'] = $art->value;
    12.         }
    13.  
    14.         if($art->field_id == 3){
    15.             $data[$key]['phone'] = $art->value;
    16.         }
    17.      
    18.         if($art->field_id == 4){
    19.             $data[$key]['metro'] = $art->value;
    20.         }
    21.     }
    22. }
    23. // Добавляю элементы
    24. foreach($data as $key => $val){
    25.  
    26.         if(empty($data[$key]['region'])){
    27.             $data[$key]['region'] = 'Не указано';
    28.         }
    29.  
    30.         if(empty($data[$key]['city'])){
    31.             $data[$key]['city'] = 'Не указано';
    32.         }
    33.  
    34.         if(empty($data[$key]['phone'])){
    35.             $data[$key]['phone'] = 'Не указано';
    36.         }
    37.  
    38.         if(empty($data[$key]['metro'])){
    39.             $data[$key]['metro'] = 'Не указано';
    40.         }
    41.       }
    При любом изменении элемента (на null, '', 'Не указано') добавленные элементы уходят в конец массива, а порядок очень важен. Из этого массива генериться excel файл
    Подскажите, в каком направлении копать? Буду очень признателен за примеры с кодом. Заранее спасибо!
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.875
    Симпатии:
    756
    Адрес:
    Татарстан
    что мешает задавать значения по условию в момент заполнения массива?
    PHP:
    1.             $data[$key]['region'] = empty($art->value) ? 'Не задано' : $art->value;;
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    с чего ты взял что в массиве надо обращаться как в объекте через "->" ?
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Volonter,
    PHP:
    1. $data[$key]['region'] = $art->value ?: 'Не указано';
    @MouseZver, наверное, потому что он точно знает, что элементы в его массиве - объекты с публичными свойствами.
     
  5. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.513
    Симпатии:
    284
    Попробуйте в новый массив вставлять массив уже заполненный значениями по умолчанию

    Как-то так
    Код (Text):
    1.  
    2. <pre>
    3. <?php
    4. $array = array(0 => array('key1' => 'one', 'key2' => 'two', 'key9' => 'nine', 'key5' => 'five'),
    5.                2 => array('key1' => 'one', 'key2' => 'two', 'key9' => 'nine', 'key5' => 'five'),
    6.                5 => array('key1' => 'one', 'key2' => 'two', 'key9' => 'nine', 'key5' => 'five'));
    7. $new_array = array();
    8. $new_row = array('key1' => 'default',
    9.                  'key2' => 'default',
    10.                  'key3' => 'default',
    11.                  'key4' => 'default',
    12.                  'key5' => 'default',
    13.                  'key6' => 'default',
    14.                  'key7' => 'default');
    15. foreach($array as $key => $row)
    16. {
    17.     $new_array[$key] = $new_row;
    18.     foreach($new_row as $k => $v)
    19.     {
    20.         if(isset($row[$k]))
    21.         {
    22.             $new_array[$key][$k] = $row[$k];
    23.         }
    24.     }
    25. }
    26. print_r($new_array);
    27. ?>
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    как вариант, можно произвести нужные манипуляции, а затем пересортировать массив через одну из сортировочных функций. если нужен порядок по ключу, то
    https://www.php.net/ksort
    https://www.php.net/krsort