2013-12-21 4 views
1

Мне нужно кодировать многомерный массив, например. CJavaScript или CJSON, но мне нужно избегать ключей массива PHP.Yii кодирует массив для JavaScript

Предполагая следующую структуру данных

$dataTree = array(
    '39'=>array(
     'label' => 'node1', 
     'children' => array(
      '42'=>array('label' => 'child1'), 
      '44'=>array('label' => 'child2'), 
    ), 
), 
    '40'=>array(
     'label' => 'node2', 
) 
); 

я должен был бы получить следующий результат (в Javascript):

var data = [ 
    { 
     label: 'node1', 
     children: [ 
      { label: 'child1' }, 
      { label: 'child2' } 
     ] 
    }, 
    { 
     label: 'node2', 
     children: [ 
      { label: 'child3' } 
     ] 
    } 
]; 

Есть ли способ сделать это?

ответ

1

Используйте этот код.

<?php 
$dataTree = array(
    '39'=>array(
     'label' => 'node1', 
     'children' => array(
      '42'=>array('label' => 'child1'), 
      '44'=>array('label' => 'child2'), 
    ), 
), 
    '40'=>array(
     'label' => 'node2', 
    'children' => array(
      '42'=>array('label' => 'child3'),   
    ), 
) 
); 
$res = array(); 
foreach($dataTree as $val) 
{ 
    $temp_ch = array(); 
    foreach($val["children"] as $ch) 
    $temp_ch[]=$ch; 
    $val["children"] = $temp_ch; 
$res[] = $val; 
} 
echo json_encode($res); 


?> 
+0

Проблема $ dataTree может иметь более 2-мерных размеров (некоторые части могут быть вложены очень сильно) –

+0

Тогда мы должны использовать рекурсивную функцию для перемещения в вашем '$ dataTree' –

+0

Я использую такую ​​вещь, но числовые индексы все еще существуют после json_encode, такие «0», «1», «2» .... –

0

При удалении числовых индексов все, что вы хотите, это должно сделать трюк для вас:

$dataTree = array(
    '39'=>array(
     'label' => 'node1', 
     'children' => array(
      '42'=>array('label' => 'child1'), 
      '44'=>array('label' => 'child2'), 
     ), 
    ), 
    '40'=>array(
     'label' => 'node2', 
     'children' => array(
      '42'=>array('label' => 'child3'), 
     ), 
    ) 
); 

function removeNumericKeys($arr) { 
    $return = array(); 
    foreach ($arr as $k => $v) { 
     $data = (is_array($v)) ? removeNumericKeys($v) : $v; 
     if (is_numeric($k)) { 
      $return[] = $data; 
     } else { 
      $return[$k] = $data; 
     } 
    } 

    return $return; 
} 


echo json_encode(removeNumericKeys($dataTree)); 
/* returns 
[ 
    { 
     "label":"node1", 
     "children":[ 
      {"label":"child1"}, 
      {"label":"child2"} 
     ] 
    }, 
    { 
     "label":"node2", 
     "children":[ 
      {"label":"child3"} 
     ] 
    } 
] 
*/ 

Это в основном рекурсивная функция, которая удаляет любые числовые индексы из передаваемых массивов.

1

Для примера:

$dataTree = array(
    '39'=>array(
     'label' => 'node1', 
     'children' => array(
      '42'=>array('label' => 'child1'), 
      '44'=>array('label' => 'child2'), 
    ), 
), 
    '40'=>array(
     'label' => 'node2', 
) 
); 

Попробуйте это:

function correctToJsonArray($array){ 
    foreach ($array as $key => $value) { 
     if(isset($value['children'])){ 
      $value['children'] = correctToJsonArray($value['children']); 
     } 
     if(isset($value['label'])){ 
      $temp[]=$value; 
     } 
    } 
    return $temp; 
} 

Какие выходы, если вы выводите так:

echo json_encode(correctToJsonArray($dataTree)); 

к,

[{"label":"node1","children":[{"label":"child1"},{"label":"child2"}]},{"label":"node2"}] 
+0

Я думаю, что он обратится к вам! –

Смежные вопросы