PHP,如果数组包含此变量

时间:2018-09-05 02:07:48

标签: php arrays

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

数组标准

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

除以,此数组为:连字符前:第一部分,连字符后:第二部分

现在,我想将此数组$stdt与另一个变量$number进行比较。

我要

如果变量$number与任何索引的第一部分相匹配,则回显匹配索引的hyphen -后的数字。

$number = '3';

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

此处,回显的值必须为45,因为变量与第一个索引匹配。我正在尝试遵循if条件,但无法得出预期的结果

if (stripos(json_encode($stdt), $number) !== false) {
    echo "index number after hyphen"; //but how to split array and echo number after hyphen
}

3 个答案:

答案 0 :(得分:1)

简单,你去

$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

UPDATE1

我想到了“高尔夫”……哈哈( 97个字节,不带换行符的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. foreach循环,我们在数字后附加-$n=3成为$n='3-'
    • 这只是为我们后面的事情缩短了时间
  3. 我们使用简写的“三元” if语句,它取自
    • condition ? if true : if false;
    • strpos-检查一个字符串在另一个字符串中的位置并返回它
    • 在这种情况下,我们要检查$n='3-'0还是第一个位置(从0开始的索引)
    • 通过将-添加到数字中,我们可以确保它与$i='33-'之类的不匹配。例如,3-33-不匹配,但3可以匹配。
    • 我们使用===严格类型检查,因为strpos返回布尔值false,如果它不在字符串中并且false == 0为真,但是false === 0不是因为它们是不同的类型。
  4. [如果为真],那么我们基本上从$n中删除了$i
    • 我们可以使用$n的长度$n='3-'或2来获取子字符串的起始位置。因此我们可以将其写为substr('3-45', 2),但由于$n可以是任何东西,因此最好进行测量
  5. [如果为假],我们只返回一个空字符串,该字符串将返回回显。

扩展代码:

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

1和2之间的差异

第一个版本基本相同,但是我意识到我可以通过将-放在前面的数字上而不是附加两次来缩短它。

主要区别是

  • 将变量缩短为1个字母(以节省空间)
  • 使用三元代替常规的if语句

UPDATE2

我要做的最后一件事是编写一个看起来更普通的更大版本:

$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

您可能有大约一百万种方法可以执行此操作。我这样做是因为它很无聊,因此尝试使其尽可能小而又短是很有趣的。

干杯!

:-p-感谢您的乐趣!

PS 我摆脱了带有修剪的那个,这是有问题的,而且很难解释他们何时以不同的方式去除东西。现在它们大致相等。

答案 1 :(得分:1)

第一个问题:

  

如果变量$ number与任何索引的第一部分匹配,则在匹配的索引的连字符号后回显数字。

要解决此问题,以下是一些未优化的代码供您逐步学习:

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

此代码假定您只想返回1个值。如果要提取以3-开头的所有值,则可以删除break;行。

从答案中的代码开始,您不应使用json_encode(),因为它不是JSON字符串;同样对于stripos(),在这种情况下也不宜使用,因为字符3可能出现在其他地方(例如,在带连字符的字符串的第二部分)。

希望有帮助。

答案 2 :(得分:1)

尝试此解决方案

<?php

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

foreach ($stdt as $item) {
    [$index, $value] = explode('-', $item);

    if ($index === $number) {
        echo $value . "\n";
    }
}