0

一些简单的代码,如果我有一个 json 数据。我想做点什么,首先检查match stringjson数据中的,如果有,输出匹配行之后的值,否则输出所有json数据。

示例1,匹配字符串为9,在json数据中匹配,输出匹配第7、3行之后的值。

$txt = '[{"a":"5"},{"a":"9"},{"a":"7"},{"a":"3"}]';
$array = json_decode($txt);
$match_string = '9';
foreach ($array as $data){      
    echo $data->a;//7, 3
}

例2,匹配字符串为2,在json数据中不匹配,输出所有值,5,9,7,3。

$txt = '[{"a":"5"},{"a":"9"},{"a":"7"},{"a":"3"}]';
$array = json_decode($txt);
$match_string = '2';
foreach ($array as $data){      
    echo $data->a;//5, 9, 7, 3
}

这个判断怎么做?我在 foreach 中做了类似的事情,只需忽略匹配字符串:

if($match_string == $data->a){
  continue;//fut this in the foreach ,get 5, 7, 3, but I need 7, 3, next value from 9.
}

谢谢。

4

4 回答 4

2

您需要设置一个标志,告诉您是否找到了匹配项:

$txt = '[{"a":"5"},{"a":"9"},{"a":"7"},{"a":"3"}]';
$array = json_decode($txt);
$match_string = "2";
$found = false;
foreach ($array as $data) {
    if ($found) {
        echo $data->a;
    } else if ($data->a === $match_string) {
        // If we set $found *after* we have the opportunity to display it,
        // we'll have to wait until the next pass.
        $found = true;
    }
}
if (!$found) {
    // Display everything
    foreach ($array as $data) {
        echo $data->a;
    }
}
于 2012-08-22T14:15:07.667 回答
2

让它更短。

$txt = '[{"a":"5"},{"a":"9"},{"a":"7"},{"a":"3"}]';
$array = json_decode($txt);
$toFind = "9";
$mapped = array_map("current",$array);

if (!in_array($toFind,$mapped))
    echo implode(", ",$mapped);
else
    echo implode(", ",array_slice($mapped,array_search($toFind,$mapped)+1));

请注意,您不会使用该功能保留键
为性能而编辑

于 2012-08-22T14:34:45.387 回答
1
$matched = false;
foreach($array as $data){
    if($matched)
        echo $data->a;
    $matched = ($data->a==$matchString) || $matched;
}
if(!$matched)
    foreach($array as $data)
        echo $data->a;

这是你的基本情况。

于 2012-08-22T14:13:54.363 回答
0

下面的代码应该可以工作,前提是 $txt 是一个有序列表而不是数组字典(对不起;我显然是幻听了)。

<?php
    $txt = '[{"a":"5"},{"a":"9"},{"a":"7"},{"a":"3"}]';
    $array = json_decode($txt);
    $match_string = '9';

    $found = false;
    foreach ($array as $data)
    {
        if ($found) // Line before was lucky
        {
            print $data->a;
            break;
        }
        if ($data->a == $match_string)
            $found = true;
    }
    if (!$found)
    {
        // Output the whole object
    }
?>

仍然不清楚当所需的匹配是数组中的最后一个条目时应该发生什么。将发生的情况是没有任何输出,因为已找到该行但没有继任者。

于 2012-08-22T14:22:35.527 回答