代码之家  ›  专栏  ›  技术社区  ›  Dipak

php if数组包含此变量

  •  1
  • Dipak  · 技术社区  · 6 年前

    stdt 包含具有以下结构的数值。

    阵列stdt

    Array
    (
        [0] => 3-65
        [1] => 4-35
    )
    

    让我们将此数组除以:在连字符之前: 第一部分 第二部分

    现在,我想比较一下这个数组 $stdt $number .

    我想

    If变量 $数字 与任何索引匹配 ,然后回显后面的数字 hyphen - 匹配索引的。

    $number = '3';
    
    $stdt = ["3-45", "4-35"];
    

    这里,回显值必须是45,因为变量和第一个索引匹配。我正在尝试下列条件,但不能得出预期的结果

    if (stripos(json_encode($stdt), $number) !== false) {
        echo "index number after hyphen"; //but how to split array and echo number after hyphen
    }
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Raptor    6 年前

    最初的问题是:

    为了解决这个问题,这里有一些优化程度较低的代码供您逐步学习:

    $number = '3';
    $stdt = ["3-45", "4-35"];
    // loop through the array $stdt
    foreach($stdt as $val) {
        // explode() is to separate the string with specific delimiter
        // in the first item in the array, $tokens[0] is 3, $tokens[1] is 45
        $tokens = explode('-', $val); 
        if($tokens[0] == $number) { // if we got a match...
            echo $tokens[1];
            break; // ...break the loop, end the process
        }
    }
    

    3- ,您可以删除 break; 线路。

    从你答案中的代码来看,你不应该使用 json_encode() stripos() ,在这种情况下不宜使用,因为 3

    希望有帮助。

        2
  •  1
  •   Mario    6 年前

    尝试此解决方案

    <?php
    
    $number = '3';
    $stdt = ["3-45", "4-35"];
    
    foreach ($stdt as $item) {
        [$index, $value] = explode('-', $item);
    
        if ($index === $number) {
            echo $value . "\n";
        }
    }
    
        3
  •  1
  •   ArtisticPhoenix    6 年前

    简单,给你

    $number='3';
    
    $stdt= ["3-45", "4-35"];
    
    array_map(function($item)use($number){if(0===strpos($item,$number.'-'))echo substr($item,strlen($number.'-'))."\n";},$stdt);
    

    输出

    45
    

    Sandbox

    更新1

    92(没有新线)。

    $n='3';
    
    $a= ["3-45", "4-35"];
    
    array_map(function($i)use($n){$n.='-';echo 0===strpos($i,$n)?substr($i,strlen($n))."\n":'';},$a);
    

    Smallifed Version

    它甚至正确地解释了

    $number = 3;
    //where 33 could be matched by "false !== strpos($i,$n)"
    $stdt= ["3-45", "4-35", "33-99"];
    

    我将解释小型化的版本,因为它更复杂。

    1. array_map
      • 在本例中,它是用户提供的闭包,如果 $i
      • 我们需要号码 $n 所以我们用 use($n)
    2. 对于每个循环,我们附加 - 到号码。 $n=3 变成 $n='3-'
      • 这只是缩短了我们以后的事情
      • condition ? if true : if false;
      • strpos -检查一个字符串在另一个字符串中的位置并返回它
      • 在这种情况下,我们要检查 $n='3-' 0 或第一个位置(基于0的索引)
      • 通过添加 - 我们可以确定它和 $i='33-' . 例如 3- 不匹配 33- 但是 3
      • === 严格的类型检查,因为 strpos公司 返回布尔值 false 如果它不在弦上 false == 0 false === 0 不是因为他们是不同的类型。
    3. 一美元
      • 我们可以用 n美元 $n='3-' 或2获得子字符串的起始位置。所以我们可以这样写 substr('3-45', 2) 但是因为 可以是任何东西,最好测量一下

    代码的扩展版本:

     array_map(
         function( $i ) use ( $n ){
             $n .= '-';
             echo (0 === strpos( $i, $n ) ) ? substr( $i, strlen( $n ) ) : '';
         },
     $a);
    

    1和2之间的差异

    - 在前面的数字上,而不是加两次。

    • 用三元代替正规 if 陈述

    最后我要做的是写一个更大更正常的版本:

    $number = 3;
    $stdt= ["3-45", "4-35", "33-99", '3-33'];
    
    //makes life easier, also solves some issues by converting number to a string.
    //We set it outside the loop for performance, we could add it with . every time but that's just waste.
    $n = $number .'-';
    //length of n
    $l = strlen($n);
    foreach($stdt AS $st){
        //find the position of $n, 0 = first, false = not found
        //again === strict type chcking
        if(0 === ($pos = strpos($st, $n))){
            //use the length of $n (one of those makes life easier things)
            //here we can use substr its much safer then trim.
            echo substr($st, $l))."\n";
        }
    
    }
    

    Bigified Version

    你可能有很多方法可以做到这一点。我这样做是因为它变得无聊,所以它的乐趣,试图使它尽可能小和短。

    干杯!

    附言 我摆脱了一个修剪,这是有问题的,很难解释,当他们删除的东西在不同的方式。现在它们大致相当。