Php 为foreach循环返回else语句

Php 为foreach循环返回else语句,php,foreach,logic,Php,Foreach,Logic,我花了大约两个小时试图弄明白这一点,所以最后我要把它贴在这里 我在一个JSON提要中有一个作业列表,我正在将其引入PHP。我想得到一个特定地点的所有工作。位置逻辑很好,我得到了所有合适的工作 我的问题是让else语句起作用。如果我使用下面的代码,它将为每个作业实例返回“无可用作业”。我可以使用I++只返回一次,但无论我的工作是否匹配,它都会返回 // This code does not work properly foreach ( $json['jobs'] as $job ) { $l

我花了大约两个小时试图弄明白这一点,所以最后我要把它贴在这里

我在一个JSON提要中有一个作业列表,我正在将其引入PHP。我想得到一个特定地点的所有工作。位置逻辑很好,我得到了所有合适的工作

我的问题是让
else
语句起作用。如果我使用下面的代码,它将为每个作业实例返回
“无可用作业”
。我可以使用
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
语句,并且只显示一次

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


对于这样一个与逻辑相关的新手问题,我深表歉意。搜索一段时间后找不到正确答案。

请使用变量输入以下信息:

$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;
    }
}

如果您只想知道是否在
$jobs
数组中表示单个位置,则不需要自己的显式循环来搜索它。您可以与结合以获取该位置的作业索引或布尔值
false

$location = 'some location';
$key = array_search($location, array_column($json['jobs'], 'location'));

if(false === $key) {
    // Array has no jobs at $location
} else {
    // Array has jobs at $location
}
使用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'];
    }
}

如果作业不可用,则在else中将
标志设置为true,如果标志为true,则输出不可用作业。可能更容易将数组重新构建到位置=>作业类型的设置中。然后使用$current_location,您可以只对新数组进行索引检查,如果它存在,则拉取在其下找到的所有子元素/作业。您在问题中显示的代码是否只是用于打印一个位置的作业的代码?是的,我只想打印一个位置的作业。作业打印得很好,我唯一的问题是在特定位置没有作业可用时打印“无可用作业”。我的逻辑要么总是正确的,要么总是错误的。那么,每个
$job
是否包含多个作业?您好!谢谢你的评论。然而,我做到了,在两页上都打印出了“找不到工作”。这是因为我的
if
语句正在从特定位置查找作业,而
else
列出了所有可用的作业。因此,
if($noJobs)
在两种情况下都返回true:-/现在我明白你的问题了。已编辑,请查看仅当作业数组仅包含1个位置时,此选项才有效。循环遍历所有作业,如果有多个位置,代码将始终将$noJobs标记为true。这是您进行编辑之前的评论。更新后的代码应该可以工作了。我现在还不能让它工作,但我会继续尝试。在我的数组中,作业标题是
$job['job']['title']
。虽然我找不到任何语法错误,但它始终返回500…这就成功了!非常感谢,很抱歉延迟接受。foreach后面有一个额外的括号,当我列出
$jobs=[]时在顶部,它不起作用,但在删除这两个东西后,我简单地创建了$jobs[]=$job['job'],并从else中的变量中删除了第一个多数组。我尝试了这个方法,但无法使它起作用。我认为您拥有的
$location
就是我拥有的
$current\u location
,而
$jobs
$job
,但还没有工作。请注意,这根本不在循环中,您应该将包含所有作业的整个数组传递给它。在上面的问题中,您正在循环使用
$json['jobs']
,所以我会尝试一下