以新闻作为例子
问题:新闻内容有标题(title)、图片(image)、文字(content)三种数据存在形式,我从HTML获取的数据是三组数组:title[]、image[]、content[];这三个数组的元素需要按顺序存进paragraphs[]中。
解决方案:
1、添加:
(1)在HTML中创建id=”paragraph_list”的div块,添加的内容class=”paragraphs”,id=”paragraph’+i+'”,其中变量i的值为:
if($('.paragraphs').length === 0) {
var i = 0;
} else {
var last = $('.paragraphs').last().attr('id');
var i = parseInt(last.substring(9, last.length));
i = i + 1;
}
在#paragraphs块里添加一个type=”hidden”,name=”xxxOrder[]”,value=””‘+i+'””的input输入框。添加的时候在#paragraph_list最后一条子元素后面插入最新的#paragraphs
(2)php获取六组数组:$newsTitleOrder、$newsTitle、$newsContentOrder、$newsContent、$newsImageOrder、$files,进行如下处理:
$news_image = array();
for($i = 1; $i < sizeof($files); $i ++) {
$imageId = $imageLogic->uploadImage($files[$i], 'news');
$news_image[] = array(
$newsImageOrder[$i-1] => $imageId,
'type' => 'image'
);
unset($imageId);
}
$news_title = array();
for($i = 0; $i < sizeof($newsTitle); $i ++) {
$news_title[] = array(
$newsTitleOrder[$i] => $newsTitle[$i],
'type' => 'title'
);
}
$news_content = array();
for($i = 0; $i < sizeof($newsContent); $i ++) {
$news_content[] = array(
$newsContentOrder[$i] => $newsContent[$i],
'type' => 'text'
);
}
$arrMerge = array_merge($news_title, $news_content, $news_image);
合并后的数组是无序的,我需要根据数组中子元素的第一个子元素的key进行排序,而且这个key可能不是连续的,因为编辑在添加的过程中可能会把前面已经添加上的内容删除了,多维数组的排序处理如下:
public function compare($arr1, $arr2) {
$index1 = array_keys($arr1)[0];
$index2 = array_keys($arr2)[0];
if($index1 <= $index2) {
return false;
} else {
return true;
}
}
usort($arrMerge, 'compare');
2、编辑
编辑和添加略有差异,主要是图片的处理,因为如果编辑没有修改图片PHP接收的$files对应的元素为空,关键在于如何对数据库中原有图片进行取舍
(1)HTML展示原有图片的时候,需要php把原有图片id传递过来:
$paragraphs = json_decode($paragraphs);
$paragraph = array();
foreach($paragraphs as $list) {
if($list->type == 'image') {
$paragraph[] = array(
'id' => $list->id,
'type' => $list->type,
'content' => $imageLogic->getImageUrl($list->id)
);
} else {
$paragraph[] = array(
'type' => $list->type,
'content' => $list->content
);
}
}
在图片的.paragraphs块里添加type=”hidden”,name=”oldImageId[]”,vlaue={{原有图片id}}的input输入框
(2)php接收的时候会多一个数组$oldImageId,创建新图片数组的时候只要加一个判断:
$news_image = array();
for($i = 1; $i < sizeof($files); $i ++) {
if($files[$i]->getName()) {
$news_image[] = array(
$newsImageOrder[$i-1] => $imageLogic->uploadImage($files[$i], 'news'),
'type' => 'image'
);
} else {
$news_image[] = array(
$newsImageOrder[$i-1] => $oldImageId[$i-1],
'type' => 'image'
);
}
}