如何在PHP

时间:2017-07-19 08:24:11

标签: javascript php arrays json object

我需要为JavaScript使用在对象内构建一个数组内的数组。我的数据是用PHP编写的,我可以使用数组中的foreach循环来组织我的必要信息:

$officeWiseEmployees = array();
foreach($employeeList as $employee) :
    $officeWiseEmployees[$employee->office_name][$employee->employee_id] = $employee->employee_name;
endforeach;

我的目的是制作数组,然后我会在必要时使用(object)进行类型转换,以便在其中创建对象。顺便说一下,结果数据是:

array:2 [
  "Office 1" => array:2 [
    1 => "User 1"
    2 => "User 2"
  ]
  "Office 2" => array:2 [
    3 => "User 3"
    4 => "User 4"
  ]
]

所需的对象数组......:

[{
    text: 'Office Name 1',
    children:
            [ { value: 1, text: 'Employee 1' }, { value: 2, text: 'Employee 2' } ]
},
{
    text: 'Office Name 2',
    children:
            [ { value: 3, text: 'Employee 3' }, { value: 4, text: 'Employee 4' } ]
}]

问题是,每当我想继续分配数组索引时,我都在foreach循环中失败。

$make_up_array = array();
foreach( $officeWiseEmployees as $office_name => $office_employees ) {
    $make_up_array['text'] = $office_name;
    foreach( $office_employees as $employee_id => $employee_name ) {
        // dump($employee_id);
        // dump($employee_name);

    }
}

你可以看到,在第3行我做错了,所以我只得到text索引下的最后一个Office名称。如果我在textchildren上引入另一个索引,那么我将进一步超越我需要的设置。

如何以简单的方式将我的PHP数组转换为对象内的数组内的JavaScript数组?我认为这比我想象的要容易,这就是为什么developer used this

3 个答案:

答案 0 :(得分:1)

正如其他人所提到的,json_encode将确定某些东西是数组还是对象。

很多复杂性来自于您将用户ID设置为每个元素的键的方式。

<?php

$employees = [
    ['id' => 1, 'name' => 'Employee 1', 'office' => 'Office 1'],
    ['id' => 2, 'name' => 'Employee 2', 'office' => 'Office 1'],
    ['id' => 3, 'name' => 'Employee 3', 'office' => 'Office 2'],
    ['id' => 4, 'name' => 'Employee 4', 'office' => 'Office 1'],
    ['id' => 5, 'name' => 'Employee 5', 'office' => 'Office 2'],
];

$offices = [];
foreach ($employees as $employee) {
    $offices[$employee['office']][] = [$employee['id'] => $employee['name']];
}

$officesOutput = [];
foreach ($offices as $name => $officeEmployees) {
    $employees = [];
    foreach ($officeEmployees as $employeeName) {
        $employees[] = [
            'value' => key($employeeName),
            'text' => current($employeeName)
        ];
    }

    $officesOutput[] = [
        'text' => $name,
        'children' => $employees
    ];
}


echo json_encode($offices, JSON_PRETTY_PRINT);
echo PHP_EOL;
echo json_encode($officesOutput, JSON_PRETTY_PRINT);

结果:

{
    "Office 1": [
        {
            "1": "Employee 1"
        },
        {
            "2": "Employee 2"
        },
        {
            "4": "Employee 4"
        }
    ],
    "Office 2": [
        {
            "3": "Employee 3"
        },
        {
            "5": "Employee 5"
        }
    ]
}
[
    {
        "text": "Office 1",
        "children": [
            {
                "value": 1,
                "text": "Employee 1"
            },
            {
                "value": 2,
                "text": "Employee 2"
            },
            {
                "value": 4,
                "text": "Employee 4"
            }
        ]
    },
    {
        "text": "Office 2",
        "children": [
            {
                "value": 3,
                "text": "Employee 3"
            },
            {
                "value": 5,
                "text": "Employee 5"
            }
        ]
    }
]

答案 1 :(得分:0)

你不必做所有这些复杂的事情。只需使用您的原始数据(在第一次foreach之后),然后

$sendtoclient = json_encode($mydeeparray) ;

然后在JS

myobj = JSON.parse(<? echo $mydeeparray? ;> 

然后你可以用对象做任何你想做的事。

如果您正在努力将数据构建为正确的形式,那么只要客户端不是至关重要的。它很受欢迎,比如排序,订购客户端。

并且,对于您的问题:您必须至少在数组中创建一个对象,否则您只需覆盖$ array [&#39; text&#39;]。我不熟悉面向对象的PHP,但你必须做这样的事情(伪代码)

§arr = array();
foreach($officewiseemployees as $office_name => $employees){
    $obj = Object();
    $obj->name =$office_name;
    $obj->employees = Array();
    foreach($employees as $employeeId => $employeename)
        $employeeObject = new Object();
        //Assign your elements to the Object
        $obj->employees.append($employeeObject);
    }
}

这只是伪代码,但看起来应该是这样的。

答案 2 :(得分:0)

尝试将对象创建为对象,然后将它们添加到正确位置的数组中。那么PHP的<input type="file" multiple class="form-control"> <label for="file-upload" class="custom-file-upload"></label>函数应该可以达到预期的效果。

这一行: json_encode()

如果想要在循环中每次添加一个新的$ office_name,那么请尝试这样:

$make_up_array['text'] = $office_name;

一般情况下,首先尝试创建顶级元素并检查JSON输出是否正确,然后一次添加一个额外的元素 - 您可能非常接近您需要的内容!