返回foreach循环的else语句

时间:2016-06-02 20:18:56

标签: php foreach logic

我花了大约两个小时试图解决这个问题,所以最后我会在这里发布。

我在JSON提要中列出了一些作业,我正在使用PHP。我想获得特定地点的所有工作。位置逻辑工作正常,我得到了所有适当的工作。

我的问题来自于使else语句生效。如果我使用下面的代码,它将为每个作业实例返回'No jobs available'。我可以使用i++只返回一次,但无论我的工作是否匹配,都会返回。

// This code does not work properly

foreach ( $json['jobs'] as $job ) {

$location = $job['job']['location'];

    if ( $location === $current_location ) {
        echo 'Job title';
    } else {
        echo 'No jobs available';
    }
}

这将返回如下内容:

Job title
Job title
No jobs available
Job title

所以基本上我需要以某种方式从foreach循环中获取else语句,并且只显示一次。

我正在寻找,用英语:对于每个工作,列出当前位置的工作。如果当前位置没有可用的作业,请打印一条声明“没有可用于您所在位置的作业。”

我为这样的新手逻辑相关问题道歉。经过一番搜索后找不到正确的答案。

3 个答案:

答案 0 :(得分:3)

使用变量来提供此信息:

$jobs = [];

foreach ( $json['jobs'] as $job ) {

    $location = $job['job']['location'];

    if ( $location === $current_location ) {
        $jobs[] = $job['job']['title'];
    }
}
if(count($jobs) === 0) {
    echo '"No Jobs Found" found';
} else {
    foreach($jobs as $job) {
        echo "See this awesome job: ".$job;
    }
}

答案 1 :(得分:1)

如果你想要做的就是告诉你app └───templates ├───templ1.hbs ├───templ2.hbs └───templ3.hbs 数组中是否有单个位置,你就不需要自己的显式循环来搜索它。您可以将array_searcharray_column结合使用,以获取该位置的作业索引或布尔值$ handlebars *.hbs -f templ.js

(...)\AppData\Roaming\npm\node_modules\handlebars\bin\handlebars:120
    throw err;
    ^
 Error: Unable to open template file "*.hbs"
    at (...)\AppData\Roaming\npm\node_modules\handlebars\dist\cjs\precompiler.js:107:25
    at FSReqWrap.oncomplete (fs.js:82:15)

答案 2 :(得分:0)

使用array_filter()使用简单的自定义函数而不是foreach循环过滤掉匹配位置的作业项。

然后检查过滤后的数组是否为空。如果它是回声"没有工作"信息;如果它不为空,则循环使用该匹配位置的foreach作业项。

<?php

function is_current_location($job) {
    if ( $job ['location'] == CURRENT_LOCATION ) {
        return true;
    } else {
        return false;
    }
}

$jobs = array_filter( $json['jobs'], "is_current_location" );

if ( empty ( $jobs ) ) {
    echo 'No jobs available';
} else {
    foreach ( $jobs as $job ) {
        echo $job['job_title'];
    }
}