【问题标题】:How to get only the "title" from JSON file [duplicate]如何从 JSON 文件中仅获取“标题”[重复]
【发布时间】:2018-09-19 06:47:07
【问题描述】:

我有这个结构(它是一个stdClass):

  stdClass Object
(
    [TitleA] => stdClass Object
        (
            [key1] => value1
            [key2] => value2
            [key3] => value3
        )

    [TitleB] => stdClass Object
        (
            [key1] => value1
            [key2] => value2
        )
)

编辑 1 感谢@John Ellmore,我将读取的 json 转换为关联数组,所以现在我有了这个:

Array
(
    [TitleA] => Array
        (
            [key1] => value1
            [key2] => value2
            [key3] => value3
        )

    [TitleB] => Array
        (
            [key1] => value1
            [key2] => value2
        )
)

我能够循环并通过keysvalues 工作,但我需要确定当前循环迭代是否是最后一个。

 $myFile  = fopen($sourceFile, "r") or die("Unable to open the file !");
 $content = json_decode(fread($myFile, filesize($sourceFile)));
 fclose($myFile);      
 foreach( $content as $keys => $value ) {
  //This loop allows me to work around with the keys     

   foreach($value as $index => $key) {
      // And this loop allows me to work with the values
   }  
 }

我需要做的是确定我何时处理循环中的最后一个title。我想我可以使用php end() function 来获取每次迭代中的最后一个键。但我不能做同样的事情来获取最后的标题名称。
所以我可以将最后一个与当前的进行比较,然后我会知道我当前是否正在循环通过最后一个。

是否可以将它们列在某种数组或类似的东西中?

【问题讨论】:

  • 将 JSON 数据解码为关联数组而不是对象可能会有所帮助。例如。 json_decode($json, true)(第二个参数是布尔值true)。
  • 投票++;谢谢 !这对我来说很容易到达我需要的地方吗?我现在会尝试解决它
  • 我认为您可以简单地计算您的迭代次数(即创建一个计数器变量并在每次迭代时将其增加一个)。然后您可以将此计数器与count($array) 进行比较。还有一些方法可以找到数组的最后一个元素(end() 函数的 PHP 手册在 cmets 中包含多个),但是由于这会更改内部数组指针,我不建议这样做。

标签: php json foreach


【解决方案1】:

您可以使用end()key() 来获取对象的最后一个标题。

$content=json_decode('{"titleA":{"key1":"val1","key2":"val2","key3":"val3"},"titleB":{"key1":"val1","key2":"val2"}}');

end($content); // place the cursor on the last position
$last_title = key($content); // get the key of the current position
// here, $last_title = 'titleB'

foreach( $content as $keys => $value ) {

    $is_last_title = $keys == $last_title;

    var_dump($keys, $is_last_title);

    //This loop allows me to work around with the keys

    foreach($value as $index => $key) {
      // And this loop allows me to work with the values
    }
}

将输出:

string(6) "titleA"
bool(false)
string(6) "titleB"
bool(true)

这也适用于数组。

【讨论】:

  • 只是和“添加”。 end() 在这种情况下无法使用 stdClass 或 Array。必须先对这些标题进行分组,然后按照您的说明进行操作。
  • @PlayHardGoPro 我使用了一个变量来存储end()的结果,但是我没有使用它。我使用了key(),就在获取最后一个元素的键之后。
  • 哦,我现在明白了!谢谢。
  • 不客气@PlayHardGoPro :)
【解决方案2】:

您可以按照您的建议使用end。这会将内部数组指针移动到最后一个元素。然后你可以使用key 来获取那个位置的密钥。

end($content);
$lastKey = key($content);

您可以在迭代 $content 时将当前键与该键值进行比较。

foreach ($content as $keys => $value) {
    if ($keys === $lastKey) echo 'Last One';
    // etc.
}

如果您已解码为数组而不是对象,您还可以使用数组计数 - 1 取消引用 array_keys 的结果以获取最后一个键。我更喜欢end/key 方法,因为它不会创建另一个您可能永远不会使用的数组,但有些人喜欢更少的代码行,所以这里是:

$lastKey = array_keys($content)[count($content) - 1];

【讨论】:

  • 有趣的是,我在@Syscall 之前看到了你的答案。
  • “内部数组指针”是正确的术语。
  • @Syscall 我认为它也适用于对象很有趣。
  • end() 无法获取最后一个title。我必须先使用另一个函数对它们进行分组。但我做了和你们展示的一样的事情。只需要收集这些头衔。耶/o/
  • @PlayHardGoPro end 本身不起作用,因为它在末尾返回数组值,而您要获取的标题是关键。但是由于end将数组指针移动到了末尾,调用key之后会得到最后一个key。
猜你喜欢
  • 1970-01-01
  • 2020-02-11
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2018-04-29
  • 1970-01-01
相关资源
最近更新 更多