2016-02-20 44 views
-1

我有几天无法解决的问题。我需要创建数组编码成JSON格式如下:[PHP] [JSON]错误生成数组

[ 
    { 
"city": "Wroclaw", 
"data": [ 
    { 
    "id": "#", 
    "name": "Zlote tarasy", 
    "city": "Wroclaw", 
    "post_code": "50-545", 
    "street": "Ko\u015bciuszki", 
    "house_no": "2", 
    "flat_no": "4", 
    "opening_hours": "8:00 - 16:00", 
    "latitude": 52.2330649, 
    "longitude": 20.9207689, 
    "description": "Opis sklepu" 
    }, 
    { 
    "id": "#", 
    "name": "Arkadia", 
    "city": "Wroclaw", 
    "post_code": "50-545", 
    "street": "Ko\u015bciuszki", 
    "house_no": "2", 
    "flat_no": "4", 
    "opening_hours": "8:00 - 16:00", 
    "latitude": 52.2571437, 
    "longitude": 20.9822873, 
    "description": "Opis sklepu" 
    } 
    ] 
    }] 

这里是我的产生阵列的方法:

public function getCollectionAsArray() 
{ 
    $stores = $this->getStoreCollection(); 

    $jsonArray = array(); 

    foreach ($stores as $store) { 

     $jsonArray[] = array(
      'city' => $store->getCity(), 
      'data' => array(
       [ 
        'id'   => $store->getIdentifier(), 
        'name'  => $store->getName(), 
        'post_code' => $store->getPostCode(), 
        'street'  => $store->getStreet(), 
        'house_no' => $store->getHouseNo(), 
        'flat_no'  => $store->getFlatNo(), 
        'latitude' => $store->getLatitude(), 
        'longitude' => $store->getLongitude(), 
        'description' => $store->getDescription() 
       ], 
      ), 
     ); 
    } 

    return $jsonArray; 
} 

它的工作,但是当我有2个相同城市的,它是创造新的城市,而不是加数据到'数据'数组:

array (size=4) 
0 => 
array (size=2) 
    'city' => string 'Wrocław' (length=8) 
    'data' => 
    array (size=1) 
     0 => 
     array (size=9) 
      ... 
1 => 
array (size=2) 
    'city' => string 'Wrocław' (length=8) 
    'data' => 
    array (size=1) 
     0 => 
     array (size=9) 

我想用array_merge和array_push但不成功。非常感谢您的帮助:)

+1

我想在你的foreach循环,如果你使用if语句来测试,如果“城市”值是在阵列'in_array()',如果是则指示代码附加数据,如果不指示代码添加新的城市。 –

+2

所以我想你只是在等人来为你做,对吧? – RiggsFolly

+0

不,我不回答。我正在努力自己做。我花了很多时间来处理这个问题,但仍然没有解决它,所以我决定向人们寻求帮助(不是现成的解决方案) – Gatzu

回答

0

一种方法可能是

public function getCollectionAsArray() 
{ 
    $stores  = $this->getStoreCollection();  
    $jsonArray = array(); 
    $i = 0;  
    foreach ($stores as $store) 
    {  
     $jsonArray[$store->getCity()][] = array( 
        'id'   => $store->getIdentifier(), 
        'name'  => $store->getName(), 
        'post_code' => $store->getPostCode(), 
        'street'  => $store->getStreet(), 
        'house_no' => $store->getHouseNo(), 
        'flat_no'  => $store->getFlatNo(), 
        'latitude' => $store->getLatitude(), 
        'longitude' => $store->getLongitude(), 
        'description' => $store->getDescription() 
       ); 
    } 
    $final = array(); 
    foreach($jsonArray as $key => $json) 
    { 
     $getkey = myfunction($final,"city",$key); 
     if($getkey) 
     { 
      $final[$getkey]["data"][] = $json; 
     } 
     else 
     { 
      $final[] = array("city" => $key , "data" => array(0 => $json)); 
     } 
    } 
    return $final; 
} 

function myfunction($products, $field, $value) 
{ 
    foreach($products as $key => $product) 
    { 
     if ($product[$field] === $value) 
     return $key; 
    } 
    return false; 
} 
+1

摆脱'$ i'和我们''''为新阵列发生 – RiggsFolly

+0

这是很好的答案,但仍然没有工作,我认为使用这么多的循环不是很好,但感谢您的帮助 – Gatzu

0

有一种简单的方法来解决你的问题。一个想法是创建一个PHP数组并使用json_encode($your_array_php)。这样的:

$jsonArray = array(
     'city' => $store->getCity(), 
     'data' => array(
       'id'   => $store->getIdentifier(), 
       'name'  => $store->getName(), 
       'post_code' => $store->getPostCode(), 
       'street'  => $store->getStreet(), 
       'house_no' => $store->getHouseNo(), 
       'flat_no'  => $store->getFlatNo(), 
       'latitude' => $store->getLatitude(), 
       'longitude' => $store->getLongitude(), 
       'description' => $store->getDescription() 
     ), 
    ); 
    $jsonArray = json_encode($jsonArray); 
+0

害怕这不是问题。再次阅读问题 – RiggsFolly