Конвертировать массив php в гораздо меньший json?

0

Я получаю массив PHP из webservice (soap xml). Из этого массива я хочу сохранить только несколько тегов, а затем преобразовать их в json (см. Образец внизу).

См. Образец массива, который я получаю из webservice, ниже:

(*** отмечает информацию, которая мне нужна в финале Json)

Array (
[0] => stdClass Object (
***[Id] => 445946
[SystemName] => 
[TrackingPixelUrl] => http://www.pix.se/picture.png
[UrlName] => Movie_Renoir_445946
***[Name] => Movie: Film
[ForeignProductId] =>
[PackageId] =>
[OrganizationId] => 1045
[Version] => 12
[TemplateId] => 81
***[Image] => stdClass Object (
[MediaId] => 41315620
[MediaType] => Image
[Url] => http://images.pix.se
[Width] => 214
[Height] => 317
[ProducedBy] =>
[CopyrightBy] =>
[ImageType] => Image
)
[Status] => Active
[PublishedDate] => 2014-11-03T10:23:09.617
[RevisionDate] =>
[ExpirationDate] => 2014-11-14T00:00:00
[Relevance] => Regional
[ParentProductId] =>
[ProductType] => Product
[IsHighlight] =>
[Attributes] => stdClass Object (
[AttributeData] => Array (
[0] => stdClass Object (
[Id] => 18895726
[AttributeId] => 125
[MetaType] => String
[Value] => stdClass Object (
***[Data] => http://www.Movie.se
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 1
[Language] => 1
)
[1] => stdClass Object (
[Id] => 18895762
[AttributeId] => 102
[MetaType] => String
[Value] => stdClass Object (
***[Data] => Text text info tinfo text Long text
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 2
[Language] => 1
)
[2] => stdClass Object (
[Id] => 20562011
[AttributeId] => 106
[MetaType] => String
[Value] => stdClass Object (
***[Data] => 70 SEK 
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 3
[Language] => 1
)
[3] => stdClass Object (
[Id] => 27970127
[AttributeId] => 99
[MetaType] => String
[Value] => stdClass Object (
[Data] => Movie: Film
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 11
[Language] => 1
)
[4] => stdClass Object (
[Id] => 27970128
[AttributeId] => 101
[MetaType] => String
[Value] => stdClass Object (
***[Data] => Short info text text text
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 11
[Language] => 1
)
[5] => stdClass Object (
[Id] => 18895724
[AttributeId] => 147
[MetaType] => String
[Value] => stdClass Object (
[Data] => +46
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 2
[Language] => 0
)
[6] => stdClass Object (
[Id] => 18895725
[AttributeId] => 145
[MetaType] => String
[Value] => stdClass Object (
***[Data] => (
0410-1111111
)
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 2
[Language] => 0
)
[7] => stdClass Object (
[Id] => 18895728
[AttributeId] => 526
[MetaType] => Boolean
[Value] => stdClass Object (
[Data] =>
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 1
[Language] => 0
)
[8] => stdClass Object (
[Id] => 27970129
[AttributeId] => 115
[MetaType] => Media
[Value] => stdClass Object (
[MediaList] => stdClass Object (
[MediaObject] => stdClass Object (
[MediaId] => 41315620
[MediaType] => Image
[Url] => http://images.pix.se
[Width] => 214
[Height] => 317
[ProducedBy] =>
[CopyrightBy] =>
[ImageType] => Image
)
)
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 10
[Language] => 0
)
[9] => stdClass Object (
[Id] => 27970130
[AttributeId] => 418
[MetaType] => MultiAttribute
[Value] => stdClass Object (
[Values] => stdClass Object (
[MultiAttributeObject] => Array (
[0] => stdClass Object (
[Id] => 0
[AttributeId] => 0
[ProductId] => 0
[OrganizationId] => 0
[MultiAttributeId] => 631
[MetaType] => Boolean
[Value] => stdClass Object (
[Data] =>
)
[Language] => 0
)
[1] => stdClass Object (
[Id] => 0
[AttributeId] => 0
[ProductId] => 0
[OrganizationId] => 0
[MultiAttributeId] => 36
[MetaType] => Boolean
[Value] => stdClass Object (
[Data] =>
)
[Language] => 0
)
[2] => stdClass Object (
[Id] => 0
[AttributeId] => 0
[ProductId] => 0
[OrganizationId] => 0
[MultiAttributeId] => 2030
[MetaType] => Boolean
[Value] => stdClass Object (
[Data] =>
)
[Language] => 0
)
)
)
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 4
[Language] => 0
)
[10] => stdClass Object (
[Id] => 27970131
[AttributeId] => 668
[MetaType] => MultiAttribute
[Value] => stdClass Object (
[Values] => stdClass Object (
[MultiAttributeObject] => Array (
[0] => stdClass Object (
[Id] => 0
[AttributeId] => 668
[ProductId] => 445946
[OrganizationId] => 1045
[MultiAttributeId] => 2022
[MetaType] => Boolean
[Value] => stdClass Object (
[Data] =>
)
[Language] => 0
)
[1] => stdClass Object (
[Id] => 0
[AttributeId] => 668
[ProductId] => 445946
[OrganizationId] => 1045
[MultiAttributeId] => 2023
[MetaType] => Boolean
[Value] => stdClass Object (
[Data] =>
)
[Language] => 0
)
[2] => stdClass Object (
[Id] => 0
[AttributeId] => 668
[ProductId] => 445946
[OrganizationId] => 1045
[MultiAttributeId] => 2174
[MetaType] => Boolean
[Value] => stdClass Object (
[Data] =>
)
[Language] => 0
)
)
)
)
[ProductId] => 445946
[OrganizationId] => 1045
[Version] => 5
[Language] => 0
)
)
)
[Categories] => stdClass Object (
[Category] => stdClass Object (
[Id] => 16015
[OrganizationId] => 1045
[Name] => Film
[DefaultTemplateId] => 81
[Status] => Active
[ParentCategoryId] => 3568
[DisplayOrder] => 99
[Icon] =>
)
)
[GeoNode] => stdClass Object (
[Id] => 3558
[Name] => Staden med omnejd
[ParentId] => 66876
[OrgId] => 1045
[Type] => Undefined
[LeftValue] => 11
[RightValue] => 12
[CityCenterLatitude] =>
[CityCenterLongitude] =>
[CityCenterRadius] =>
)
[Occasions] => stdClass Object (
[OccasionObject] => stdClass Object (
[Id] => 19836976
[AttributeId] => 111
[ProductId] => 445946
[OrganizationId] => 1045
***[StartDate] => 2014-11-12T00:00:00
***[EndDate] => 2014-11-13T00:00:00
***[StartTime] => 0001-01-01T19:00:00
[EndTime] => 0001-01-01T19:00:00
***[ValidDays] => Wednesday Thursday
***[ArenaId] => 75316
***[ArenaName] => Moviegrafteatern Movie, Staden
[EntryTime] => 0001-01-01T00:00:00
)
)
[SupplierId] =>
[Duration] =>
[ForeignProductIds] => stdClass Object (
)
[LanguageId] => 1
)
)

Я хотел бы, чтобы последний, обрезанный, json выглядел так:

  {  
      "Id":445946,
      "Name": "Movie: Film",
      "Image":{
         "Url":"http://images.pix.se",
         "Width":595,
         "Height":709
      },
      "MovieUrl": "http://www.Movie.se",
      "LongText": "Text text info tinfo text Long text",
      "Price": "70 SEK",
      "ShortText": "Short info text text text",
      "Phone": "0410-1111111",
      "StartDate": 2014-11-12T00:00:00,
      "EndDate": 2014-11-13T00:00:00,
      "StartTime": 0001-01-01T19:00:00,
      "ValidDays": "Wednesday Thursday",
      "ArenaId": 75316,
      "ArenaName": "Moviegrafteatern Movie, Staden"
      }

Как преобразовать этот массив в гораздо меньший JSON?

Теги:
arrays

3 ответа

1

Я думаю, что единственный способ решить эту проблему - это отображать ваши элементы, которые вам нужны в функции, а затем перебирать разные объекты, потому что структура, которую вы получаете с этим множеством разных объектов, довольно дрянная.

function cleanUpResult(array)
{
    $r = array();
    foreach($item in $array){
     $result = array(); 

      $result["Id"] = $item["Id"];
      $result["Name"] = $item["Name"];
      $result["Image"] = array();
      $result["Image"]["Url"] =$item["Image"]->Url;
      $result["Image"]["Width"] =$item["Id"]->Width;
      $result["Image"]["Height"] =$item["Id"]->Height;
      $result["MovieUrl"] = $item["Attributes"]->AttributeData[0]->Value->Data;
      $result["LongText"] = $item["Attributes"]->AttributeData[1]->Value->Data;
      $result["Price"] = $item["Attributes"]->AttributeData[2]->Value->Data;;
      $result["ShortText"] = $item["Attributes"]->AttributeData[4]->Value->Data;
      $result["Phone"] = $item["Attributes"]->AttributeData[6]->Value->Data;
      $result["StartDate"] = $item["StartDate"];
      $result["EndDate"] = $item["EndDate"];
      $result["StartTime"] = $item["StartTime"];
      $result["ValidDays"] = $item["ValidDays"];
      $result["ArenaId"] = $item["ArenaId"];
      $result["ArenaName"] = $item["ArenaName"];
      $r[] = $result;
    }
    return json_encode($r);
}
0

Просто создайте список ключей массива, который вы хотите использовать в белом списке, а затем удалите остальные.

Предположим, что ваш объект $ object

//this line must come before any output is made. (echo, print, etc.)
header('Content-Type: application/json');

//whitelist. the items you want to keep
$keep = array("id", "name", "image" ...);

foreach($object as $object) {

    foreach ($object as $key => $product) {

        if( !in_array($key, $keep) ) { //check if the current loop key is not in the whitelist
            unset($object[$key]);
        }

    }

}



//Then convert the array to JSon.

echo json_encode($object)

Тогда объект $ будет содержать только то, что было в белом списке

  • 0
    ОП имеет массив объектов , AFAIU. Смотрите [0] => stdClass Object .
  • 0
    @mudasobwa Обновлено для многомерного
Показать ещё 1 комментарий
0

Это не сложно, но поскольку вы хотите, чтобы различные поля находились внутри вложенного массива, самый простой подход - просто перебрать массив и захватить отдельные поля, которые вы хотите кодировать. Я не уверен, что стоит потратить время на создание умного фильтра.

Например, скажем, $soapArray содержит приведенную выше информацию:

$data = array();

// iterate over the full field list
foreach ($soapArray as $soapElement) {

    // construct a partial array containing the fields you want
    $data[] = array(
        'Id' => $soapElement['Id'],
        'Name' => $soapElement['Name'],
        'Image' => array(
            'Url' => $soapElement['Image']->Url,
            'Width' => $soapElement['Image']->Width,
            'Height' => $soapElement['Image']->Height,
        ),
        'MovieUrl' => $soapElement['Attributes']->AttributeData[0]->Value->Data,
        'LongText' => $soapElement['Attributes']->AttributeData[1]->Value->Data,
    );
}

// display the encoded array
echo json_encode($data);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню