За последние 24 часа нас посетили 22874 программиста и 1271 робот. Сейчас ищут 849 программистов ...

Как проверить конечность массива

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

  1. Dark19

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

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    Добрый день, мне нужно по условию проверять не дошел ли я до конца массива $arr['i'] и $arr['j'], если дошел то нужно выполнить некие действия. Подскажите как можно проверить не дошел ли до конца массива? Проверять в цикле нет возможности так как там по условиям нужные элементы формируются в новый массив, а из текущего удаляются и текущий массив прогоняется по циклу пока он не станет пустым.
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    если ты колдуешь над списком-через-запятую, то это делается через implode() :)

    а если нет, то буквальный ответ такой: есть функции end() и key() чтобы получить индекс последнего элемента. индекс по определению уникален, так что это надежный признак.

    другой вариант: если ты удаляешь элементы, то очевидно при последнем элементе длина массива равна 1 )))
     
  3. Dark19

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

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    Вот я об этом
    я проверяю вот так !next($data[$arrCenter[$i]]['j']) && !next($data[$arrCenter[$i]]['i'], но оно работает не правильно, как с помощью указанных Вами функций можно проверить?
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А может код выложите? Так проще будет понять что вы хотите.
     
  5. Dark19

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

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    Не хотел Вас пугать, но ладно
    Код (PHP):
    1. $machin = 1200;
    2. $iter = ceil((count($data[$arrCenter[$i]]['j']) + count($data[$arrCenter[$i]]['i'])) / 2) + ceil($w / $machin);
    3.  
    4.                     for($a=0;$a<$iter;$a++){
    5.  
    6.                             if($data[$arrCenter[$i]]['j'][$a]['order'] == 0 && $data[$arrCenter[$i]]['i'][$a]['order'] == 0){
    7.  
    8.                                 if(($data[$arrCenter[$i]]['i'][$a]['weight'] + $data[$arrCenter[$i]]['j'][$a]['weight']) <= $machin) {
    9. //проверяем вес, если меньше допустимого, записываем точку пути в новый массив и удаляем данный элемент с текущего
    10.                                     $weight[$a] = $data[$arrCenter[$i]]['i'][$a]['weight'] + $data[$arrCenter[$i]]['j'][$a]['weight'];
    11.  
    12.                                     array_unshift($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['i'][$a]['name']);
    13.                                     unset($data[$arrCenter[$i]]['i'][$a]);
    14.                                     echo $data[$arrCenter[$i]]['j'][$a]['name'];echo "<br/>";
    15.                                     array_push($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['j'][$a]['name']);
    16.                                     unset($data[$arrCenter[$i]]['j'][$a]);
    17.  
    18.                                 }
    19.                             }
    20.  
    21.                             if($data[$arrCenter[$i]]['j'][$a]['order'] < $data[$arrCenter[$i]]['i'][$a]['order']){
    22.                                 //проверяем вес, если меньше допустимого, записываем точку пути в новый массив и удаляем данный элемент с текущего
    23.                                 if((array_sum($weight) + $data[$arrCenter[$i]]['j'][$a]['weight']) <= $machin) {
    24.  
    25.                                     $weight[$a] = array_sum($weight) + $data[$arrCenter[$i]]['j'][$a]['weight'];
    26.  
    27.                                     array_push($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['j'][$a]['name']);
    28.                                     unset($data[$arrCenter[$i]]['j'][$a]);
    29.  
    30.                                 }
    31. //проверяем вес, если меньше допустимого, записываем точку пути в новый массив и удаляем данный элемент с текущего
    32.                                 if((array_sum($weight) + $data[$arrCenter[$i]]['i'][$a]['weight']) <= $machin){
    33.  
    34.                                     $weight[$a] = array_sum($weight) + $data[$arrCenter[$i]]['i'][$a]['weight'];
    35.  
    36.                                     array_unshift($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['i'][$a]['name']);
    37.                                     unset($data[$arrCenter[$i]]['i'][$a]);
    38.  
    39.                                 }
    40.  
    41.                             }
    42.  
    43.  
    44.                             if($data[$arrCenter[$i]]['i'][$a]['order'] < $data[$arrCenter[$i]]['j'][$a]['order']){
    45.                                 //проверяем вес, если меньше допустимого, записываем точку пути в новый массив и удаляем данный элемент с текущего
    46.                                 if((array_sum($weight) + $data[$arrCenter[$i]]['i'][$a]['weight']) <= $machin) {
    47.  
    48.                                     $weight[$a] = array_sum($weight) + $data[$arrCenter[$i]]['i'][$a]['weight'];
    49.                                     array_unshift($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['i'][$a]['name']);
    50.                                     unset($data[$arrCenter[$i]]['i'][$a]);
    51.  
    52.                                 }
    53. //проверяем вес, если меньше допустимого, записываем точку пути в новый массив и удаляем данный элемент с текущего
    54.                                 if((array_sum($weight) + $data[$arrCenter[$i]]['j'][$a]['weight']) <= $machin){
    55.                                     $weight[$a] = array_sum($weight) + $data[$arrCenter[$i]]['j'][$a]['weight'];
    56.                                     array_push($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['j'][$a]['name']);
    57.                                     unset($data[$arrCenter[$i]]['j'][$a]);
    58.  
    59.                                 }
    60.                             }
    61. //если дошли до конца текущих массивов и они не пустые обнуляем значения
    62.                         if ((!next($data[$arrCenter[$i]]['j']) && !next($data[$arrCenter[$i]]['i']) && (!empty($data[$arrCenter[$i]]['j']) && !empty($data[$arrCenter[$i]]['j'])))){
    63.                             $a = -1;
    64.                             $weight = array();
    65.                             $data[$arrCenter[$i]]['j']=array_values($data[$arrCenter[$i]]['j']);
    66.                             $data[$arrCenter[$i]]['i']=array_values($data[$arrCenter[$i]]['i']);
    67.                             $c++;
    68.                             $path[$arrCenter[$i]][$c] = array();
    69.                             $iter = ceil((count($data[$arrCenter[$i]]['j']) + count($data[$arrCenter[$i]]['i'])) / 2);
    70.                         }
    71.                         else{
    72.                             break;
    73.                         }
    74.                     } 
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    конечно вы и их можете использовать неправильно, как и next. почитайте справку по функциям.
     
  7. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Предупреждать же надо )) Я если честно, слегка потерялся.
    Код (PHP):
    1. //если дошли до конца текущих массивов и они не пустые обнуляем значения
    2.     if ((count($data[$arrCenter[$i]]['j']) == 0 && count(($data[$arrCenter[$i]]['i'])) == 0 && (!empty($data[$arrCenter[$i]]['j']) && !empty($data[$arrCenter[$i]]['j'])))) {
    3. ...
    4. }
    count($array) - количество элементов в массиве, 1 - остался последний, 0 - пусто.

    Такое лучше переписать, вы же сами не разберетесь в этом через неделю ) Возможно стоит написать алгоритм на листочке, выделить отдельные подзадачи в функции и дергать их в нужном порядке. Ну и избавиться от привычки давать переменным имена вроде i,j. Пусть они будут длиннее, но с понятным названием. Так хотя бы нагляднее будет.

    p.s. Вы ведь знаете о существовании foreach() который итерирует массив от начала до конца?
     
  8. Dark19

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

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    count($array) == 1 не подходит для проверки последнего элемента, так как в цикле выбираются элементы которые подходят по весу. Например: грузоподьемность машины 1000кг, элемент из первого массива(і) = 430кг из второго(j) = 200кг, опять из первого(і) 150кг и т.д., заполнили машину до 1000кг и записали имена элементов которые подошли в массив - это есть первый путь машины. А нужно распределить все элементы из массивов(i и j) по путям, пока массив не станет пустым. То есть после распределения элементов по путям в массивах может остаться еще много элементов и мне нужно их распределять пока не выберу их все оттуда. И получается так, что при каждом формировании пути нужно обойти массив i и массив j, потом обнулить значения счетчиков и прочего и повторять это пока массивы не опустеют.
     
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    хм...
    Код (Text):
    1.  
    2. (!next($data[$arrCenter[$i]]['j'])
    3. && !next($data[$arrCenter[$i]]['i'])
    4. && (!empty($data[$arrCenter[$i]]['j'])
    5. && !empty($data[$arrCenter[$i]]['j'])))
    я правильно понимаю, что вы хотели узнать существует ли элемент $data[$arrCenter[$i]]['j'][$a + 1] и не пуст ли он?
     
  10. Dark19

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

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    Нет, это !next($data[$arrCenter[$i]]['j']) && !next($data[$arrCenter[$i]]['i'] я нашел в гугле, но оно не подходит. В общем мне нужно проверять дошел ли я до конца массивов $data[$arrCenter[$i]]['j'] и $data[$arrCenter[$i]]['і'] и не путы ли они, если дошел до конца обеих массивов и в них еще есть элементы, я обнуляю значения и обхожу массивы вновь, пока не удалю все значения в них, что будет означать, что все пути построены.
    А нету такой функции, которая бы могла проверить не находится ли эта итерация на последнем элементе массива? Только вот там еще проблема, один массив может быть больше другого, то есть у одного массива уже может быть конец а в другом еще есть не проеденные элементы, а мне нужно чтобы цикл прошел оба массива до конца и потом уже обнулил счетчики
     
  11. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Смотрите, в коде у вас массив итерируется по $a ($data[$arrCenter[$i]]['j'][$a]) и $a увеличивается на 1 с каждым циклом, тогда возможно стоит его и проверять? isset($data[$arrCenter[$i]]['j'][$a+1]) - проверка на существование empty($data[$arrCenter[$i]]['j'][$a+1]) - проверка на пустоту. Соответственно если $a + 1 нету, то и следующего цикла не будет. Ну и раз вы сбрасываете счетчик, то нужно делать отдельную проверку на то, что пора заканчивать, иначе все зациклится.
     
  12. Dark19

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

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    Спасибо, помогло. Еще проблема, как сделать правильно проверку на пустоту, чтобы не зациклить?
    Я делаю вот так:
    Код (PHP):
    1.                     while($r != 1){
    2. //some code
    3.                         if(empty($data[$arrCenter[$i]]['j']) && empty($data[$arrCenter[$i]]['i'])){
    4.                             $r = 1;
    5.                         }
    6. }
    7.  
    получается зацикливание
     
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Ну, идея верна, если оба массива пусты, то делаем break;. Возможно один из массивов больше и постоянно оказывается не пустым?
     
  14. Dark19

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

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    да, один массив в большинстве случаев будет больше, но по идее он когда то должен закончится