数组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
}
答案 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
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);
它甚至可以正确解决
之类的问题$number = 3;
//where 33 could be matched by "false !== strpos($i,$n)"
$stdt= ["3-45", "4-35", "33-99"];
我将小版本解释为更复杂。
array_map
遍历数组并应用回调函数,您可以将其视为循环。
$i
$n
,因此我们使用use($n)
来传递数字-
。 $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
不是因为它们是不同的类型。$n
中删除了$i
。
$n
的长度$n='3-'
或2来获取子字符串的起始位置。因此我们可以将其写为substr('3-45', 2)
,但由于$n
可以是任何东西,因此最好进行测量扩展代码:
array_map(
function( $i ) use ( $n ){
$n .= '-';
echo (0 === strpos( $i, $n ) ) ? substr( $i, strlen( $n ) ) : '';
},
$a);
1和2之间的差异
第一个版本基本相同,但是我意识到我可以通过将-
放在前面的数字上而不是附加两次来缩短它。
主要区别是
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";
}
}
您可能有大约一百万种方法可以执行此操作。我这样做是因为它很无聊,因此尝试使其尽可能小而又短是很有趣的。
干杯!
:-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";
}
}