【问题标题】:json encode specific object's propertyjson 编码特定对象的属性
【发布时间】:2021-12-10 00:10:31
【问题描述】:

我有一个数组:

[
    (int) 0 => object(stdClass) {
        key1 => 'aaa'
        key2 => 'bbb'
        key3 => 'ccc'
    },
    (int) 1 => object(stdClass) {
        key1 => 'ddd'
        key2 => 'eee'
        key3 => 'fff'
    },
    (int) 2 => object(stdClass) {
        key1 => 'ggg'
        key2 => 'hhh'
        key3 => 'iii'
    }
]

我想为这个数组返回一个 json_encode,但仅限于“key2”和“key3”属性。

暂时:

foreach($myArray as $key){
    unset($key->key1);
}

但这并不好,因为数组还可能包含其他属性。如果可能的话,我宁愿不使用循环......

(对不起我的英语)

【问题讨论】:

  • 一种或另一种方式会涉及到循环。为什么不喜欢?
  • 你可以看看array_map函数..
  • @KIKOSoftware> 你可能是对的。这很奇怪,但在我看来,循环是“丑陋的”。
  • 循环只不过是重复一段代码的一种方式。计算机非常擅长这样做。它是您工具包中的基本工具。循环也很容易理解。将它们视为“丑陋”是很奇怪的。那个是从哪里来的?你必须小心对代码有这样的主观意见,它们没有帮助,可能会让你成为一个糟糕的程序员。你知道array_map() 也循环遍历数组吗?

标签: php arrays json multidimensional-array


【解决方案1】:

此解决方案使用array_map()array_intersect_key()

<?php

$data = [
  ['key1' => 'aaa', 'key2' => 'bbb', 'key3' => 'ccc'],
  ['key1' => 'ddd', 'key2' => 'eee', 'key3' => 'fff'],
  ['key1' => 'ggg', 'key2' => 'hhh', 'key3' => 'iii']
];

/**
 * define allowed keys
 *
 * array_flip() exchanges the keys with their values
 * so it becomes ['key2' => 0, 'key3' => 1]
 * useful for array_intersect_key() later on
 *
 */
$allowed = array_flip(['key2', 'key3']);

$newData = array_map(
  function($item) use ($allowed) {
    return array_intersect_key($item, $allowed); 
  }, 
  $data
);

echo json_encode($newData);

...打印:

[{"key2":"bbb","key3":"ccc"},{"key2":"eee","key3":"fff"},{"key2":"hhh","key3":"iii"}]

【讨论】:

    【解决方案2】:

    这可以通过在数组上使用array_map 并创建一个新的对象数组来完成,该数组只包含您想要的属性。

    <?php
    
    $arr = [
        ['key1' => 'aaa','key2' => 'bbb','key3' => 'ccc'],
        ['key1' => 'ddd','key2' => 'eee','key3' => 'fff'],
        ['key1' => 'ggg','key2' => 'hhh','key3' => 'iii']
    ];
    
    $obj = json_decode(json_encode($arr)); // to turn sample data into objects
    
    $output = array_map(function ($e) {
        $new_obj = new stdClass;
        $new_obj->key2 = $e->key2;
        $new_obj->key3 = $e->key3;
        return $new_obj;
    }, $obj);
    
    var_dump($output);
    

    结果

    array(3) {
      [0]=>
      object(stdClass)#5 (2) {
        ["key2"]=>
        string(3) "bbb"
        ["key3"]=>
        string(3) "ccc"
      }
      [1]=>
      object(stdClass)#6 (2) {
        ["key2"]=>
        string(3) "eee"
        ["key3"]=>
        string(3) "fff"
      }
      [2]=>
      object(stdClass)#7 (2) {
        ["key2"]=>
        string(3) "hhh"
        ["key3"]=>
        string(3) "iii"
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2016-10-10
      • 2021-06-22
      • 2019-03-23
      • 2012-08-26
      • 2012-03-27
      相关资源
      最近更新 更多