Если вы используете этот код на локальном сервере (т. е. ваш компьютер для целей разработки), он не отправит электронное письмо получателю. Что произойдет, он создаст файл .txt
в папке с именем mailoutput
.
В случае, если вы используете бесплатный сервисный сервис, например 000webhost
или hostinger
, эти поставщики услуг отключают функцию mail()
, чтобы предотвратить непреднамеренное использование электронной почты, спам и т. д. Я предпочитаю вас чтобы связаться с ними, чтобы узнать, поддерживают ли они эту функцию.
Если вы уверены, что поставщик услуг поддерживает функцию mail (), вы можете проверить это руководство по PHP для дальнейшей справки, PHP mail ()
Чтобы проверить, поддерживает ли ваша служба хостинга функцию mail (), попробуйте запустить этот код (не забудьте изменить адрес электронной почты получателя)
Надеюсь, что это помогли.
Также как Perl,
loop1:
for (var i in set1) {
loop2:
for (var j in set2) {
loop3:
for (var k in set3) {
break loop2; // breaks out of loop3 and loop2
}
}
}
, как определено в разделе 12.12 EMCA-262. [MDN Docs]
В отличие от C эти метки могут использоваться только для continue
и break
, поскольку Javascript не имеет goto
.
Я немного опаздываю на вечеринку, но следующий язык - агностический подход, который не использует GOTO / ярлыки или обертывание функций:
for (var x = Set1.length; x > 0; x--)
{
for (var y = Set2.length; y > 0; y--)
{
for (var z = Set3.length; z > 0; z--)
{
z = y = -1; // terminates second loop
// z = y = x = -1; // terminate first loop
}
}
}
. Поверхность протекает естественно, что должен понравиться толпе не-GOTO. С другой стороны, внутренний цикл должен завершить текущую итерацию до завершения, чтобы в некоторых сценариях она не применима.
break
или continue
сразу после установки z и y? Мне нравится идея использовать условия цикла for
для выхода. Элегантный по-своему.
– Ben Sutton
7 December 2015 в 19:01
Оберните это в функцию, а затем просто return
.
лучший способ - 1) Сортировка обоих массивов, которые используются в первом и втором циклах. 2) если элемент согласован, то разбить внутренний цикл и удерживать значение индекса. 3) при запуске следующей итерации запустите внутренний цикл с индексом удержания.
Как об использовании каких-либо разрывов вообще, никаких флажков отмены и никаких дополнительных проверок условий. Эта версия просто взрывает переменные цикла (делает их Number.MAX_VALUE
), когда условие встречается, и заставляет все петли прекращать элегантно.
// No breaks needed
for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
if (condition) {
console.log("condition met");
i = j = Number.MAX_VALUE; // Blast the loop variables
}
}
}
Был найден аналогичный ответ для вложенного типа типа декрементирования петли, но это работает для вложенных циклов инкрементного типа, не требуя рассмотрения значения конца цикла для простых циклов.
Другой пример:
// No breaks needed
for (var i = 0; i < 89; i++) {
for (var j = 0; j < 1002; j++) {
for (var k = 0; k < 16; k++) {
for (var l = 0; l < 2382; l++) {
if (condition) {
console.log("condition met");
i = j = k = l = Number.MAX_VALUE; // Blast the loop variables
}
}
}
}
}
var str = "";
for (var x = 0; x < 3; x++) {
(function() { // here's an anonymous function
for (var y = 0; y < 3; y++) {
for (var z = 0; z < 3; z++) {
// you have access to 'x' because of closures
str += "x=" + x + " y=" + y + " z=" + z + "<br />";
if (x == z && z == 2) {
return;
}
}
}
})(); // here, you execute your anonymous function
}
Как это? :)
x
, если какая-либо логика в цикле ссылается на x в более поздний момент времени (например, она определяет внутреннюю анонимную функцию, которая сохраняется и выполняется позже), значение для x будет быть тем, что было в конце цикла end i>, а не индексом, который была определена во время. (Продолжение)
– devios1
31 May 2012 в 22:57
x
в качестве параметра вашей анонимной функции, чтобы он создал новую копию, которая может затем i> ссылаться как закрытие, поскольку оно не изменится с этого момента. Короче говоря, я рекомендую ответить эфемеру.
– devios1
31 May 2012 в 22:57
Если вы используете Coffeescript, есть удобное ключевое слово «сделать», которое упрощает определение и немедленно выполняет анонимную функцию:
do ->
for a in first_loop
for b in second_loop
if condition(...)
return
... поэтому вы можете просто использовать «возврат», чтобы выйти из петель.
for
не две.
– Gary Willoughby
19 July 2017 в 20:23
XXX.Validation = function() {
var ok = false;
loop:
do {
for (...) {
while (...) {
if (...) {
break loop; // Exist the outermost do-while loop
}
if (...) {
continue; // skips current iteration in the while loop
}
}
}
if (...) {
break loop;
}
if (...) {
break loop;
}
if (...) {
break loop;
}
if (...) {
break loop;
}
ok = true;
break;
} while(true);
CleanupAndCallbackBeforeReturning(ok);
return ok;
};
довольно просто
var a=[1,2,3];
var b=[4,5,6];
var breakCheck1=false;
for (var i in a){
for (var j in b){
breakCheck1=true;
break;
}
if (breakCheck1) {break;}
}
loop1=loop2=false;
– Muhammad Umer
9 April 2015 в 04:30
Как насчет нажатия петель до их конечных пределов
for(var a=0; a<data_a.length; a++){
for(var b=0; b<data_b.length; b++){
for(var c=0; c<data_c.length; c++){
for(var d=0; d<data_d.length; d++){
a = data_a.length;
b = data_b.length;
c = data_b.length;
d = data_d.length;
}
}
}
}
Я знаю, что это было спрошено 8 лет назад, но в ES6 мы получили цикл для ... , который позволяет использовать стандартные функции прерывания:
for (let item of items) {
if (item.id === id) {
//do something cool
break;
}
}
Я думал, что покажу функционально-программирующий подход. Вы можете вырваться из вложенных функций Array.prototype.some () и / или Array.prototype.every (), как в моих решениях. Дополнительным преимуществом этого подхода является то, что Object.keys()
перечисляет только собственные перечислимые свойства объекта, тогда как «for-in loop также перечисляет свойства в цепочке прототипов» .
Близко к решению OP:
Args.forEach(function (arg) {
// This guard is not necessary,
// since writing an empty string to document would not change it.
if (!getAnchorTag(arg))
return;
document.write(getAnchorTag(arg));
});
function getAnchorTag (name) {
var res = '';
Object.keys(Navigation.Headings).some(function (Heading) {
return Object.keys(Navigation.Headings[Heading]).some(function (Item) {
if (name == Navigation.Headings[Heading][Item].Name) {
res = ("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
return true;
}
});
});
return res;
}
Решение, которое уменьшает итерацию над заголовками / элементами:
var remainingArgs = Args.slice(0);
Object.keys(Navigation.Headings).some(function (Heading) {
return Object.keys(Navigation.Headings[Heading]).some(function (Item) {
var i = remainingArgs.indexOf(Navigation.Headings[Heading][Item].Name);
if (i === -1)
return;
document.write("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
remainingArgs.splice(i, 1);
if (remainingArgs.length === 0)
return true;
}
});
});
Я понимаю, что это действительно старая тема, но поскольку мой стандартный подход еще не здесь, я решил опубликовать его для будущих googlers.
var a, b, abort = false;
for (a = 0; a < 10 && !abort; a++) {
for (b = 0; b < 10 && !abort; b++) {
if (condition) {
doSomeThing();
abort = true;
}
}
}
condition
оценивает true
на первой итерации вложенного цикла, вы все равно выполняете оставшуюся часть из 10 итераций, каждый раз проверяя значение abort
. Это не проблема производительности для 10 итераций, но это будет, скажем, 10 000.
– Robusto
2 December 2013 в 16:53
abort
и выражения. В простых сценариях, которые могут быть прекрасными, но для огромных циклов с gazillion итерациями, которые могут быть проблемой
– Z. Khullah
11 December 2017 в 18:08
goto
ярлык. Вы, по сути, называете цикл и говорите, что я хочу вырваться из такого цикла. – devios1 31 May 2012 в 22:50continue
иbreak
. – Gary Willoughby 12 November 2015 в 22:17