【问题标题】:If elseif condition inside foreach with arrayif elseif条件在foreach中使用数组
【发布时间】:2016-10-18 12:05:13
【问题描述】:

我在 foreach 循环中使用了if elseif 条件。在if 和elseif 内部,两个不同的函数正在调用和检索相同数组$nice[] 的值。如果我运行以下代码,则只有 if 条件有效。

$youtube = array(
             'https://www.youtube.com/watch?v=nCwRJUg3tcQ1&list=PLv5BUbwWA5RYaM6E-QiE8WxoKwyBnozV2&index=4',
             'http://vimeo.com/channels/vimeogirls/87973054123',
             'http://www.youtube.com/watch?v=nCwRJUg3tcQ2&feature=relate',
             'http://youtube.com/v/nCwRJUg3tcQ3?feature=youtube_gdata_player');  

$nice = array();  

foreach ($youtube as $url) {
    if(preg_grep("/youtu/i", $youtube)){
        $nice[] = getYoutubeId($url);
    }elseif(preg_grep("/vimeo/i", $youtube)){
        $nice[] = getVimeoId($url);
    }
}  

print_r($nice);  

function getVimeoId($url)
{
    if (preg_match('#(?:https?://)?(?:www.)?(?:player.)?vimeo.com/(?:[a-z]*/)*([0-9]{6,11})[?]?.*#', $url, $m)) {
        return 'v_'.$m[1];
    }
    return false;
}  

function getYoutubeId($url)
{
    $parts = parse_url($url);
    if (isset($parts['host'])) {
        $host = $parts['host'];
        if (false === strpos($host, 'youtube') &&
            false === strpos($host, 'youtu.be')
            ) 
        {
            return false;
        }
    }
    if (isset($parts['query'])) {
        parse_str($parts['query'], $qs);
        if (isset($qs['v'])) {
            return 'y_'.$qs['v'];
        }
        else if (isset($qs['vi'])) {
            return 'y_'.$qs['vi'];
        }
    }
    if (isset($parts['path'])) {
        $path = explode('/', trim($parts['path'], '/'));
        return 'y_'.$path[count($path) - 1];
    }
    return false;
}

当前输出为:

    Array ( 
        [0] => y_nCwRJUg3tcQ1 
        [1] => 
        [2] => y_nCwRJUg3tcQ2 
        [3] => y_nCwRJUg3tcQ3 
    )  

[1] 位置没有值。

【问题讨论】:

  • 第一个猜测是 getVimeoId 返回 null、false 或类似的值。请检查该方法是否有错误和/或提供其代码,以便我们查看。
  • 看看这两个函数的作用可能会有用。因为正是那些功能正在做正确或错误的事情。 你不觉得
  • @FranzGleichmann 更新了代码。
  • 一点代码缩进会让我们更容易阅读你的代码,但更重要的是你更容易调试
  • 将if(preg_grep("/youtu/i", $youtube)) 替换为if (stripos($url, "youtu") !== false) 之类的内容或查看您得到的答案。

标签: php arrays function if-statement foreach


【解决方案1】:

首先,您的 if() 子句正在检查主数组$youtube 而不是值:$url。
也许下面的 sn-p 会有所帮助:

    $youtube = array(
        'https://www.youtube.com/watch?v=nCwRJUg3tcQ1&list=PLv5BUbwWA5RYaM6E-QiE8WxoKwyBnozV2&index=4',
        'http://vimeo.com/channels/vimeogirls/87973054123',
        'http://www.youtube.com/watch?v=nCwRJUg3tcQ2&feature=relate',
        'http://youtube.com/v/nCwRJUg3tcQ3?feature=youtube_gdata_player');

    $nice = array();

    foreach ($youtube as $url) {
        if(preg_match("#youtu#i", $url)){
            $nice[] = getYoutubeId($url);
        }elseif(preg_match("#vimeo#i", $url)){
            $nice[] = getVimeoId($url);
        }
    }

【讨论】:

  • 完美工作,maahn...非常感谢。你拯救了我的一天:)
猜你喜欢
  • 2012-02-05
  • 2021-04-28
  • 1970-01-01
  • 2014-08-08
  • 2021-07-11
  • 2023-04-09
  • 2015-06-16
  • 1970-01-01
  • 2020-11-20
相关资源
最近更新 更多