Добрый день, мне нужно по условию проверять не дошел ли я до конца массива $arr['i'] и $arr['j'], если дошел то нужно выполнить некие действия. Подскажите как можно проверить не дошел ли до конца массива? Проверять в цикле нет возможности так как там по условиям нужные элементы формируются в новый массив, а из текущего удаляются и текущий массив прогоняется по циклу пока он не станет пустым.
если ты колдуешь над списком-через-запятую, то это делается через implode() а если нет, то буквальный ответ такой: есть функции end() и key() чтобы получить индекс последнего элемента. индекс по определению уникален, так что это надежный признак. другой вариант: если ты удаляешь элементы, то очевидно при последнем элементе длина массива равна 1 )))
Вот я об этом я проверяю вот так !next($data[$arrCenter[$i]]['j']) && !next($data[$arrCenter[$i]]['i'], но оно работает не правильно, как с помощью указанных Вами функций можно проверить?
Не хотел Вас пугать, но ладно Код (PHP): $machin = 1200; $iter = ceil((count($data[$arrCenter[$i]]['j']) + count($data[$arrCenter[$i]]['i'])) / 2) + ceil($w / $machin); for($a=0;$a<$iter;$a++){ if($data[$arrCenter[$i]]['j'][$a]['order'] == 0 && $data[$arrCenter[$i]]['i'][$a]['order'] == 0){ if(($data[$arrCenter[$i]]['i'][$a]['weight'] + $data[$arrCenter[$i]]['j'][$a]['weight']) <= $machin) { //проверяем вес, если меньше допустимого, записываем точку пути в новый массив и удаляем данный элемент с текущего $weight[$a] = $data[$arrCenter[$i]]['i'][$a]['weight'] + $data[$arrCenter[$i]]['j'][$a]['weight']; array_unshift($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['i'][$a]['name']); unset($data[$arrCenter[$i]]['i'][$a]); echo $data[$arrCenter[$i]]['j'][$a]['name'];echo "<br/>"; array_push($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['j'][$a]['name']); unset($data[$arrCenter[$i]]['j'][$a]); } } if($data[$arrCenter[$i]]['j'][$a]['order'] < $data[$arrCenter[$i]]['i'][$a]['order']){ //проверяем вес, если меньше допустимого, записываем точку пути в новый массив и удаляем данный элемент с текущего if((array_sum($weight) + $data[$arrCenter[$i]]['j'][$a]['weight']) <= $machin) { $weight[$a] = array_sum($weight) + $data[$arrCenter[$i]]['j'][$a]['weight']; array_push($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['j'][$a]['name']); unset($data[$arrCenter[$i]]['j'][$a]); } //проверяем вес, если меньше допустимого, записываем точку пути в новый массив и удаляем данный элемент с текущего if((array_sum($weight) + $data[$arrCenter[$i]]['i'][$a]['weight']) <= $machin){ $weight[$a] = array_sum($weight) + $data[$arrCenter[$i]]['i'][$a]['weight']; array_unshift($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['i'][$a]['name']); unset($data[$arrCenter[$i]]['i'][$a]); } } if($data[$arrCenter[$i]]['i'][$a]['order'] < $data[$arrCenter[$i]]['j'][$a]['order']){ //проверяем вес, если меньше допустимого, записываем точку пути в новый массив и удаляем данный элемент с текущего if((array_sum($weight) + $data[$arrCenter[$i]]['i'][$a]['weight']) <= $machin) { $weight[$a] = array_sum($weight) + $data[$arrCenter[$i]]['i'][$a]['weight']; array_unshift($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['i'][$a]['name']); unset($data[$arrCenter[$i]]['i'][$a]); } //проверяем вес, если меньше допустимого, записываем точку пути в новый массив и удаляем данный элемент с текущего if((array_sum($weight) + $data[$arrCenter[$i]]['j'][$a]['weight']) <= $machin){ $weight[$a] = array_sum($weight) + $data[$arrCenter[$i]]['j'][$a]['weight']; array_push($path[$arrCenter[$i]][$c], $data[$arrCenter[$i]]['j'][$a]['name']); unset($data[$arrCenter[$i]]['j'][$a]); } } //если дошли до конца текущих массивов и они не пустые обнуляем значения if ((!next($data[$arrCenter[$i]]['j']) && !next($data[$arrCenter[$i]]['i']) && (!empty($data[$arrCenter[$i]]['j']) && !empty($data[$arrCenter[$i]]['j'])))){ $a = -1; $weight = array(); $data[$arrCenter[$i]]['j']=array_values($data[$arrCenter[$i]]['j']); $data[$arrCenter[$i]]['i']=array_values($data[$arrCenter[$i]]['i']); $c++; $path[$arrCenter[$i]][$c] = array(); $iter = ceil((count($data[$arrCenter[$i]]['j']) + count($data[$arrCenter[$i]]['i'])) / 2); } else{ break; } }
Предупреждать же надо )) Я если честно, слегка потерялся. Код (PHP): //если дошли до конца текущих массивов и они не пустые обнуляем значения if ((count($data[$arrCenter[$i]]['j']) == 0 && count(($data[$arrCenter[$i]]['i'])) == 0 && (!empty($data[$arrCenter[$i]]['j']) && !empty($data[$arrCenter[$i]]['j'])))) { ... } count($array) - количество элементов в массиве, 1 - остался последний, 0 - пусто. Такое лучше переписать, вы же сами не разберетесь в этом через неделю ) Возможно стоит написать алгоритм на листочке, выделить отдельные подзадачи в функции и дергать их в нужном порядке. Ну и избавиться от привычки давать переменным имена вроде i,j. Пусть они будут длиннее, но с понятным названием. Так хотя бы нагляднее будет. p.s. Вы ведь знаете о существовании foreach() который итерирует массив от начала до конца?
count($array) == 1 не подходит для проверки последнего элемента, так как в цикле выбираются элементы которые подходят по весу. Например: грузоподьемность машины 1000кг, элемент из первого массива(і) = 430кг из второго(j) = 200кг, опять из первого(і) 150кг и т.д., заполнили машину до 1000кг и записали имена элементов которые подошли в массив - это есть первый путь машины. А нужно распределить все элементы из массивов(i и j) по путям, пока массив не станет пустым. То есть после распределения элементов по путям в массивах может остаться еще много элементов и мне нужно их распределять пока не выберу их все оттуда. И получается так, что при каждом формировании пути нужно обойти массив i и массив j, потом обнулить значения счетчиков и прочего и повторять это пока массивы не опустеют.
хм... Код (Text): (!next($data[$arrCenter[$i]]['j']) && !next($data[$arrCenter[$i]]['i']) && (!empty($data[$arrCenter[$i]]['j']) && !empty($data[$arrCenter[$i]]['j']))) я правильно понимаю, что вы хотели узнать существует ли элемент $data[$arrCenter[$i]]['j'][$a + 1] и не пуст ли он?
Нет, это !next($data[$arrCenter[$i]]['j']) && !next($data[$arrCenter[$i]]['i'] я нашел в гугле, но оно не подходит. В общем мне нужно проверять дошел ли я до конца массивов $data[$arrCenter[$i]]['j'] и $data[$arrCenter[$i]]['і'] и не путы ли они, если дошел до конца обеих массивов и в них еще есть элементы, я обнуляю значения и обхожу массивы вновь, пока не удалю все значения в них, что будет означать, что все пути построены. А нету такой функции, которая бы могла проверить не находится ли эта итерация на последнем элементе массива? Только вот там еще проблема, один массив может быть больше другого, то есть у одного массива уже может быть конец а в другом еще есть не проеденные элементы, а мне нужно чтобы цикл прошел оба массива до конца и потом уже обнулил счетчики
Смотрите, в коде у вас массив итерируется по $a ($data[$arrCenter[$i]]['j'][$a]) и $a увеличивается на 1 с каждым циклом, тогда возможно стоит его и проверять? isset($data[$arrCenter[$i]]['j'][$a+1]) - проверка на существование empty($data[$arrCenter[$i]]['j'][$a+1]) - проверка на пустоту. Соответственно если $a + 1 нету, то и следующего цикла не будет. Ну и раз вы сбрасываете счетчик, то нужно делать отдельную проверку на то, что пора заканчивать, иначе все зациклится.
Спасибо, помогло. Еще проблема, как сделать правильно проверку на пустоту, чтобы не зациклить? Я делаю вот так: Код (PHP): while($r != 1){ //some code if(empty($data[$arrCenter[$i]]['j']) && empty($data[$arrCenter[$i]]['i'])){ $r = 1; } } получается зацикливание
Ну, идея верна, если оба массива пусты, то делаем break;. Возможно один из массивов больше и постоянно оказывается не пустым?