如何在Laravel中从Json中获取特定值

hc8w905p  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(168)

我有这个Json输出,我想从中获得特定值,这是json

[
    [
        [
            "a:1:{s:3:\"ALL\";d:100;}",
            "a:1:{s:3:\"ALL\";d:200;}",
            "a:1:{s:3:\"ALL\";d:89;}"
        ],
        [
            "a:1:{s:3:\"USD\";d:100;}"
        ],
        [
            "a:2:{s:3:\"ALL\";d:300;s:3:\"USD\";d:250;}"
        ],
        [
            "a:1:{s:3:\"ALL\";d:30;}",
            "a:2:{s:3:\"ALL\";d:100;s:3:\"USD\";d:200;}"
        ],
        [
            "a:1:{s:3:\"USD\";d:200;}"
        ]
    ]
]

所以我只想得到第一个d值,它们是数字,目前我尝试了这样的方法:

$values = explode('-',$this->currency);
        return $values[0];

但它不工作,我知道我必须使用foreach来获得其余的,但不知道如何获得一个的值。

EDIT我编写了以下代码:

$values = explode('-',$this->currency);

      foreach ($values as $val){
          $arr[] = unserialize($val);
      }
      return $arr;

而这就是我得到的

[
    [
        [
            {
                "ALL": 100
            },
            {
                "ALL": 200
            },
            {
                "ALL": 89
            }
        ],
        [
            {
                "USD": 100
            }
        ],
        [
            {
                "ALL": 300,
                "USD": 250
            }
        ],
        [
            {
                "ALL": 30
            },
            {
                "ALL": 100,
                "USD": 200
            }
        ],
        [
            {
                "USD": 200
            }
        ]
    ]
]

现在输出是正确的,但是我需要得到一些特定的值,比如在第一个数组中,我们有3个ALL值,100,200,89,我想做一个循环,分别给我**100,200,89,这样我就可以得到它们的总和,剩下的是其他的数

第二次编辑

如果我只是

$values = explode('-',$this->currency);
        
      return $values;

我得到这个结果:

[
    [
        [
            "a:1:{s:3:\"ALL\";d:100;}",
            "a:1:{s:3:\"ALL\";d:200;}",
            "a:1:{s:3:\"ALL\";d:89;}"
        ],
        [
            "a:1:{s:3:\"USD\";d:100;}"
        ],
        [
            "a:2:{s:3:\"ALL\";d:300;s:3:\"USD\";d:250;}"
        ],
        [
            "a:1:{s:3:\"ALL\";d:30;}",
            "a:2:{s:3:\"ALL\";d:100;s:3:\"USD\";d:200;}"
        ],
        [
            "a:1:{s:3:\"USD\";d:200;}"
        ]
    ]
]
biswetbf

biswetbf1#

如果你使用Laravel,最好使用集合。假设$contents是包含序列化值的数组,你可以像下面这样反序列化。

$unserializedArray = collect($contents)
                        ->map(function($content){
                                /**
                                * Looping the inital array
                                */
                                return collect($content)
                                        ->map(function($data){
                                            /**
                                            * Looping the inner array
                                            */
                                            return collect($data)
                                                    ->map(function($seralized){
                                                        /**
                                                        * Unserializing the  
                                                        * seralized values 
                                                        */  
                                                        return unserialize($seralized);
                                                    });

                                        });
                            })->toArray();

你可以写同样的代码上面提到的速记如下:

$unserializedArray = collect($content)
                        ->map(fn($data)=>collect($data)
                                ->map(fn($fArr)=>collect($fArr)
                                        ->map(fn($serialized)=>unserialize($serialized))))
                                            ->toArray();

使用键获取值

$selectedKey = 'ALL';
$response    = collect($unserializedArray)
                 ->map(function($unserialized)use($selectedKey){
                     return collect($unserialized)
                              ->map(function($unserializeData)use($selectedKey){
                                 return collect($unserializeData)
                                            ->pluck($selectedKey);
                              })->collapse();
                 })->collapse()->filter()->values();

response是$selectedKey的集合,因此使用它可以很容易地获得sum或值的数组

/**
  * Sum 
  */

  $sum = collect($response)->sum()

 /**
  * Array 
  */

  $responseArray = collect($response)->toArray()

你也可以做所有这一切,以及如下:

$selectedKey = 'ALL';
        $unserializedArray = collect($contents)
                                ->map(fn($content)=>
                                        collect($content)
                                            ->map(fn($serilizeArray) => 
                                                    collect($serilizeArray)
                                                        ->map(fn($serialized)=>unserialize($serialized))
                                                        ->pluck($selectedKey))
                                            ->collapse())
                                ->collapse();
        
        $sum   = collect($unserializedArray)->sum();
        
        $array = collect($unserializedArray)->toArray();

相关问题