поэтому у меня есть веб-программа для загрузки файла TSV, который содержит следующую таблицу:
------------------------------------------------
SANDI PENDAPATAN
------------------------------------------------
4.1 PENDAPATAN BUNGA/BAGI HSL & OPR UTAMA
410 PENDAPATAN BUNGA/BAGI HASIL
4100 PENDAPATAN BUNGA PENEMPATAN DANA
4101 PEND BNG/DISKON SRT BERHARGA YG DIBELI
4102 PENDAPATAN BNG.DOKUMEN/FASILITAS
4103 PEND BNG/PREMI TAGIHAN DERIVATIF
417 PENDAPATAN OPERASI UTAMA SYARIAH
4170 PENDAPATAN MARGIN MURABAHAH
4171 PENDAPATAN SALAM PARALEL
4172 PENDAPATAN ISTISHNA PARALEL
4173 PENDAPATAN BERSIH SEWA IJARAH
теперь посмотрим на полеСандиmsgstr «вы можете видеть, что идентификаторы отсортированы по иерархии.
4.1 => as a parent
410 and 417 => as a child of 4.1
4100-4103 => as a sub child of 410
4170-4172 => as a sub child of 417
Я хочу, чтобы эти плоские данные были древовидными:
4.1 PENDAPATAN BUNGA/BAGI HSL & OPR UTAMA
410 PENDAPATAN BUNGA/BAGI HASIL
4100 PENDAPATAN BUNGA PENEMPATAN DANA
4101 PEND BNG/DISKON SRT BERHARGA YG DIBELI
4102 PENDAPATAN BNG.DOKUMEN/FASILITAS
4103 PEND BNG/PREMI TAGIHAN DERIVATIF
Это пример структуры таблицы для сохранения записей:
COLUMN NAME DATA TYPE
------------------------------------
id_detail int
sandi varchar
pendapatan varchar
parent_id int
Я уже искал данные об иерархии, родителя и ребенка и т. Д. Но я не нашел то, что мне нужно. Вопрос в том:
Как вставить поле «parent_id» автоматически на основе идентификаторов на «sandi» с зацикливанием PHP?
Пример:
id_detail sandi pendapatan parent_id
1 4.1 PENDAPATAN BUNGA/BAGI HSL & OPR 0
2 410 PENDAPATAN BUNGA/BAGI HASIL 1
3 4100 PENDAPATAN BUNGA PENEMPATAN DANA 2
4 4101 PEND BNG/DISKON SRT BERHARGA YG DIBELI 2
пожалуйста, помогите мне, с синтаксисом PHP CodeIgniter .. спасибо за ваше внимание
Основываясь на вашем подробном описании вашего вопроса (хотя вы ничего не пробовали), я покажу вам, как этого добиться в CodeIgniter.
сначала вам нужен контроллер
class ImportTSV extends CI_Controller
{
public function import()
{
$this->load->model("ImportTSV_Model");
$this->ImportTSV_Model->import();
}
}
и модель, которая содержит собственную модель и класс для ваших объектов данных
class ImportTSV_Model extends CI_Model
{
private $strFile = "data.tsv";
private $masterNodeId = "41";
private $arrDataObjects = array();
public function __construct()
{
$this->prepareDataFromFile();
}public function import()
{
$objMasterNode = $this->arrDataObjects[$this->masterNodeId];
$this->save($objMasterNode);
}
private function save($objNode)
{
$arrInsertToDbData = array(
"sandi" => $objNode->sandi,
"pendapatan" => $objNode->pendapatan,
"parent_id" => $objNode->mysqlParentId
);
$this->db->insert("your_table", $arrInsertToDbData);
$id = $this->db->insert_id();
if (count($objNode->arrChilds) > 0)
{
foreach($objNode->arrChilds AS $objNode)
{
$objNode->mysqlParentId = $id;
$this->save($objNode);
}
}
}
private function prepareDataFromFile()
{
$file = FCPATH."assets/".$this->strFile;
$objFile = new SplFileObject($file);
while(!$objFile->eof())
{
$line = $objFile->fgets();
$arrDataPerLine = explode("\t",$line);
$objTSVData = new TSVData_Object;
$objTSVData->prepareDataFromLine($arrDataPerLine);
$this->arrDataObjects[$objTSVData->formattedSandi] = $objTSVData;
}
foreach($this->arrDataObjects AS $objItem)
{
//set parent ID
$parent = substr($objItem->formattedSandi,0,-1);
if (isset($this->arrDataObjects[$parent])) $this->arrDataObjects[$parent]->addChild($objItem);
}
}
}class TSVData_Object
{
public $sandi;
public $pendapatan;
public $formattedSandi;
public $mysqlParentId = 0;
public $arrChildObjects = array();public function prepareDataFromLine($arrLine)
{
$this->sandi = $arrLine[0];
$this->pendapatan = $arrLine[1];
$this->formattedSandi = str_replace(".","",$this->sandi);
}
public function addChild(TSVData_Object $objItem)
{
$this->arrChildObjects[] = $objItem;
}
}
я предположил, что ваш файл находится в каталоге FCPATH. «assets /».
Других решений пока нет …