#javascript #php #arrays
#javascript #php #массивы
Вопрос:
Я сохранил в базе данных список элементов со столбцом порядка. В этой таблице у меня есть несколько участников с одинаковым порядковым номером. Это означает, что строки с одинаковым порядком являются дочерними элементами элемента «Папка».
Я получаю что-то вроде этого из таблицы members:
membername, order
'Anna', 1
'Michael', 2
'Melissa', 2
'Charlie', 3
Плагин jQuery, который я использую (DasBaum), поддерживает следующий пример ввода для массива javascript:
items: [
{label:'Anna'},
{
label:'Folder',
items: [{label:'Michael', label:'Melissa'}]
},
{label:'Charlie'},
]
Я думал сделать массив в виде строки с помощью PHP, но я действительно не знаю, как обрабатывать foreach для дочерних элементов и «Папок».
$output = "";
foreach ($dbdata->members as $member) {
// $member->order
// $member->membername;
}
dd($output);
Комментарии:
1. Сначала попробуйте самостоятельно. Это не
code my appfor me
сайт2. конечно, это не a
code my app for me site
, и я действительно не хочу копировать и вставлять комментарий. Мне нужна идея о том, как обращаться с дочерними элементами, потому что я должен создать массив «папка» до того, как foreach узнает, совпадает ли порядок с предыдущим.3. Это
suggest a way for me to do
тоже не сайт. Это для конкретных проблем с кодированием.
Ответ №1:
Сначала вам нужно сгруппировать эти значения соответствующим образом, затем, после их группировки, просто используйте json_encode()
. Так что действительно нужно использовать $.ajax
в этом. В этом примере я просто использовал jQuery. Поскольку у вас действительно недостаточно кода, я просто составлю некоторые фиктивные данные (у вас все равно нет необходимых запросов к базе данных). Рассмотрим этот пример: пример вывода
<?php
if(isset($_POST['get_values'])) {
// select * from table (this is a sample, just a simulation)
$values_from_db = array(
array('membername' => 'Anna', 'order' => 1),
array('membername' => 'Michael', 'order' => 2),
array('membername' => 'Melissa', 'order' => 2),
// array('membername' => 'Jack', 'order' => 2),
array('membername' => 'Charlie', 'order' => 3),
);
$group = array();
// grouping first
foreach($values_from_db as $key => $value) {
$group[$value['order']][] = $value['membername'];
}
$items = array();
// format to items
foreach($group as $key => $value) {
if(count($value) > 1) {
$sub_items = array();
foreach($value as $val) {
$sub_items[] = array('label' => $val);
}
$items[] = array('label' => 'Folder', 'items' => $sub_items);
} else {
$items[] = array('label' => $value[0]);
}
}
echo json_encode($items, JSON_PRETTY_PRINT);
exit;
}
?>
<link rel="stylesheet" href="http://www.mkleinhans.de/github/dasBaum/dasBaum.css" />
<div id="tree"></div>
<!-- <script src="jquery.min.js"></script> -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://www.mkleinhans.de/github/dasBaum/examples/jquery-ui-1.8.18.custom.min.js"></script>
<script type="text/javascript" src="http://www.mkleinhans.de/github/dasBaum/dasBaum.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$.ajax({
url: document.URL,
type: 'POST',
data: {get_values: true},
dataType: 'JSON',
success: function(items) {
$('#tree').dasBaum({
sort: false,
foldersOnTop: false,
items: items
});
}
});
});
</script>
Ответ №2:
(Допустимо только для 1 дочерней глубины)
Во-первых, нам нужно решить, собираемся ли мы иметь дочерние элементы.
Затем мы создаем массив со счетчиком количества дочерних элементов для каждого значения порядка.
И мы устанавливаем счетчик каждого из них.
Теперь мы можем создать основной foreach и обрабатывать, есть ли у члена дочерние элементы или нет.
Если это правда, мы создаем элемент «папка» и другой foreach для заполнения массива items.
Если значение false, мы заполняем массив без дочерних элементов.
Наконец, мы отмечаем, был ли этот порядок проанализирован ранее, чтобы избежать создания массива для каждого элемента для каждого заказа.
$groups = [];
foreach ($dbdata->members as $member){
$groups[$member->order] = 0;
$parsed[$member->order] = 0;
}
foreach ($dbdata->members as $member){
$groups[$member->order] ;
}
$output = "[";
foreach ($dbdata->members as $member) {
if ($groups[$member->order] > 1 and $parsed[$member->order] == 0){
$output .= "{
label:'Folder',
items: [";
foreach ($dbdata->members as $child) {
if ($child->order == $member->order){
$output .= "{label:'".$child->membername."'},";
}
}
$output .= "]
},";
}elseif ($groups[$member->order] <= 1 and $parsed[$member->order] == 0){
$output .= "{label:'".$member->membername."'},";
}
$parsed[$member->order] = 1;
//$prueba .= "·" . $member->order . ") " . $member->membername;
}
$output .= "]";
Теперь мы можем использовать $output
переменную в коде javascript для вызова плагина.