【问题标题】:Return an else statement for foreach loop为 foreach 循环返回 else 语句
【发布时间】:2016-06-02 20:18:56
【问题描述】:

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

我有一个 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

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

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

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

【问题讨论】:

  • 如果作业不可用,则将flag 设置为true,如果标志为真,则输出没有作业可用。
  • 可能更容易将阵列重建为位置 => 作业类型的设置。然后使用 $current_location,您可以对新数组进行索引检查,如果存在,则拉取在其下找到的所有子元素/作业。
  • 您在问题中显示的代码是否只是用于打印某个位置的作业的代码?
  • 是的,我只想打印一个位置的作业。作业打印正常,我唯一的问题是在该特定位置没有可用作业时打印“没有可用作业”。按照我的逻辑,它要么总是对的,要么总是错的。
  • 那么,每个$job 是否包含多个作业?

标签: php foreach logic


【解决方案1】:

使用变量来放置这些信息:

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

【讨论】:

  • 您好!谢谢你的评论。我这样做了,但是,“没有找到工作”打印在两页上。这是因为我的if 语句正在从特定位置寻找工作,而else 列出了所有可用的工作。因此,if ($noJobs) 在这两种情况下都返回 true。 :-/
  • 现在我明白你的问题了。编辑好了,看看
  • 这仅适用于作业数组仅包含 1 个位置的情况。循环浏览所有作业,如果有超过 1 个位置,您的代码将始终将 $noJobs 标记为 true。这是您进行编辑之前的评论。更新后的代码应该可以工作
  • 我目前无法让它工作,但我会继续努力。在我的数组中,职位是$job['job']['title']。尽管我找不到任何语法错误,但它一直返回 500...
  • 做到了!非常感谢,也很抱歉延迟接受。在 foreach 之后有一个额外的括号,当我在顶部列出 $jobs = []; 时它不起作用,但是在删除这两个东西之后,我只是制作了 $jobs[] = $job['job'] 并删除了我在 else 中的变量中的第一个多数组。
【解决方案2】:

如果您只想判断$jobs 数组中是否表示单个位置,则不需要自己的显式循环来搜索它。您可以将array_searcharray_column 结合起来,以获得该位置的工作索引或布尔值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
}

【讨论】:

  • 我试过这个,但无法让它工作。我认为你所拥有的$location 就是我所拥有的$current_location,而$jobs$job,但目前还没有工作。
  • 请注意,这根本不在循环中,您应该将包含所有作业的整个数组传递给它。在你上面的问题中,你循环了$json['jobs'],所以我会试试
【解决方案3】:

使用 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'];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2014-02-11
    • 2019-12-12
    • 2018-12-03
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多