public function testDiff() { $input1 = ["a", "b", "c"]; $input2 = ["b", "c", "d"]; $this->assertEquals(["a"], arr_diff($input1, $input2)); }
function arr_diff($a1, $a2) { $ar = array(); foreach ($a2 as $k => $v) { if (!is_array($v)) { if ($v !== $a1[$k]) { $ar[$k] = $v; } } else { if ($arr = arr_diff($a1[$k], $a2[$k])) { $ar[$k] = $arr; } } } return $ar; }
/** 글 수정 * @class write * @param $data: 글쓰기 data, 이미 check와 가공이 끝난 데이터여야 함 $board_data: 게시판 설정 data -id: 게시판 아이디. 게시판 설정 data가 없을 때 아이디를 토대로 설정을 로드한다. -no: 대상 글번호 지정. (글번호를 지정할 수 있다. 없다면 data에 저장되어 있는 자료를 수정) -is_update: 회원정보 업데이트 여부 -is_ex: 이전정보 로드 여부 -is_check: 입력변수 체크 여부 */ function editPost(&$data, $board_data = '', $param = '') { global $mini; $param = param($param); iss($param['id']); iss($param['no']); iss($data['no']); def($param['is_update'], 1); def($param['is_ex'], 1); def($param['is_check'], 1); $trackback = $trackback_excerpt = $trackback_charset = ''; if (!empty($data['trackback'])) { $trackback = $data['trackback']; } if (!empty($data['trackback_excerpt'])) { $trackback_excerpt = $data['trackback_excerpt']; } if (!empty($data['trackback_charset'])) { $trackback_charset = $data['trackback_charset']; } $is_saveImage = !empty($data['saveImage']) ? 1 : 0; unset($data['pass']); // 패스워드는 먼저 제거 unset($data['num']); unset($data['prev']); unset($data['next']); unset($data['target_member']); unset($data['trackback']); unset($data['pingback']); unset($data['ip']); unset($data['date_comment']); unset($data['name_comment']); unset($data['count_comment']); unset($data['hit']); unset($data['vote']); unset($data['hate']); unset($data['download']); unset($data['date']); unset($data['date_last']); unset($data['date_expire']); unset($data['history_vote']); unset($data['history_hit']); if (empty($mini['member']['level_admin'])) { unset($data['ment_advice']); unset($data['is_lock']); unset($data['admit_file']); unset($data['admit_post']); unset($data['relate']); } //// 게시판 설정 if (!is_array($board_data)) { if ($param['id']) { $board_data = getBoard($param['id'], 1); } else { __error('게시판 설정이 없습니다'); } } //// 게시물 번호 $no = $param['no'] ? $param['no'] : $data['no']; unset($data['no']); check($no, "type:num, name:게시물번호"); //// 데이터 로드 if ($param['is_ex']) { $data_ex = sql("SELECT * FROM {$board_data['table']} WHERE no={$no}"); if (!is_array($data_ex)) { __error('해당 게시물이 존재하지 않습니다'); } } //// 잠긴글 if (empty($mini['member']['level_admin']) && !empty($data_ex['is_lock'])) { __error('게시물이 잠겨 있어 수정, 삭제를 할 수 없습니다'); } //// 회원정보 로드 if (!empty($data_ex['target_member'])) { $mdata = sql("SELECT * FROM {$mini['name']['member']} WHERE no={$data_ex['target_member']}"); // 회원정보 업데이트 여부 if ($param['is_update'] && $param['is_ex'] && $data_ex['target_member']) { if (is_array($mdata)) { parseMember($mdata); $data['name'] = $mdata['name']; } else { $data_ex['target_member'] = $data['target_member'] = 0; $data['pass'] = md5(); } } } //// 권한 체크 if (!empty($data_ex['target_member'])) { if (empty($mini['log'])) { __error('권한이 없습니다. [로그인이 필요합니다]'); } if (empty($mini['member']['level_admin']) && !getPermit("name:edit") && $mdata['no'] != $mini['member']['no']) { __error('권한이 없습니다. [자신이 쓴 글만 수정할 수 있습니다]'); } if (!empty($mini['member']['level_admin']) && !getPermit("name:edit") && $mdata['no'] != $mini['member']['no'] && $mdata['level_admin'] >= $mini['member']['level_admin']) { __error('권한이 없습니다. [자신보다 높거나 같은 권한의 관리자가 쓴 글 입니다]'); } } else { if (empty($mini['member']['level_admin']) && !getPermit("name:edit")) { if (empty($_REQUEST['pass_encode'])) { __error('비밀번호가 없습니다'); } if (!empty($mini['log']) && empty($mini['member']['level_admin'])) { __error('권한이 없습니다. [비회원이 쓴글 입니다]'); } if (empty($mini['member']['level_admin']) && $_REQUEST['pass_encode'] != md5("{$data_ex['pass']}|{$mini['ip']}|" . session_id())) { __error('권한이 없습니다. [비밀번호가 일치하지 않습니다]'); } } } //// 추가필드 권한 체크 if (!empty($board_data['field'])) { foreach ($board_data['field'] as $key => $val) { if (!empty($data['field'][$key]) && !empty($val['is_admin']) && empty($mini['member']['level_admin'])) { __error("[{$val['name']}]은 관리자만 입력하실 수 있습니다"); } if (empty($data['field'][$key]) && !empty($val['is_req'])) { __error("[{$val['name']}]을 입력해 주세요"); } } } //// 수정 시간제한 if (!empty($board_data['limit_edit_post']) && empty($mini['member']['level_admin'])) { if (!empty($data_ex) && strtotime($data_ex['date']) + $board_data['limit_edit_post'] * 60 < $mini['time']) { __error("작성 후 {$board_data['limit_edit_post']}분이 지난 글을 수정할 수 없습니다"); } } //// 입력정보 체크 if (empty($data['target_member']) && empty($mini['member'])) { check($data['name'], "min:1, max:16, name:이름"); } if (!empty($data['mail'])) { check($data['mail'], "type:mail, name:메일"); } //// 입력변수 체크 if ($param['is_check']) { // 입력변수 체크 checkField($data, $board_data['table'], $param); // 글 가공 checkPost($data, $board_data); } //+ 수정 정보 넣는다 //// 직접 수정이 안되는 정보는 제외시킨다 unset($data['no']); unset($data['num']); unset($data['date']); unset($data['ip']); unset($data['hit']); unset($data['vote']); unset($data['hate']); unset($data['admit_file']); unset($data['admit_post']); unset($data['target_member']); //+ 권한별로 제외하는 필드를 지정한다. (이를테면 target_member 같은거 바꿀 수 없으니깐) //// 휴지통 if (!empty($board_data['use_trash_edit'])) { $trash = $trash_tmp = array(); foreach ($data_ex as $key2 => $val2) { switch ($key2) { case 'num': case 'category': case 'tag': case 'target_member': case 'name': case 'mail': case 'title': case 'ment': case 'ip': case 'date': case 'trackback': $trash[$key2] = $val2; break; case 'no': case 'prev': case 'next': break; default: $trash_tmp[$key2] = $val2; } } // 변경점 $tmp_data_ex = $data_ex; str($tmp_data_ex, 'decode'); $tmp_diff = arr_diff($tmp_data_ex, $data, 1); // 정의되지 않은 것들은 제외 if (!empty($tmp_diff['data_ex'])) { foreach ($tmp_diff['data_ex'] as $key2 => $val2) { if (!isset($data[$key2])) { unset($tmp_diff['data_ex'][$key2]); } } } if (!empty($tmp_diff['data'])) { foreach ($tmp_diff['data'] as $key2 => $val2) { if (!isset($data_ex[$key2])) { unset($tmp_diff['data'][$key2]); } } } if (empty($tmp_diff['data'])) { unset($tmp_diff['data']); } if (empty($tmp_diff['data_ex'])) { unset($tmp_diff['data_ex']); } // 가공 if (!empty($tmp_diff)) { $tmp_diff = serialize($tmp_diff); $trash = array_merge($trash, array('target_member_in' => !empty($mini['log']) ? $mini['member']['no'] : 0, 'ip_in' => $mini['ip'], 'date_in' => $mini['date'], 'num' => $data_ex['no'], 'id' => $board_data['no'], 'is_edit' => 1, 'field' => serialize($trash_tmp), 'diff' => $tmp_diff)); sql("INSERT INTO {$mini['name']['trash']} " . query($trash, 'insert')); } } //// 쿼리 sql("UPDATE {$board_data['table']} SET " . query($data, 'update') . " WHERE no={$no}"); //// 정보 재입력 $data['no'] = $data_ex['no']; //// 총 게시물 수 수정 if ($param['is_ex']) { iss($data_ex['category']); iss($data_ex['tag']); $check = 0; if (isset($data['category'])) { if ($data['category'] != $data_ex['category']) { $check = 1; } } if (isset($data['tag'])) { if ($data['tag'] != $data_ex['tag']) { $check = 1; } } if ($check) { updateTotal($data_ex, $board_data, 'del'); updateTotal($data, $board_data, 'add'); if (!empty($mini['board']) && $board_data['no'] == $mini['board']['no']) { $mini['board']['total'] = $board_data['total']; } sql("UPDATE {$mini['name']['admin']} SET total = '" . serialize($board_data['total']) . "' WHERE no={$board_data['no']}"); } } //// 검색어 수정 if ($param['is_ex']) { if (!empty($data['title']) && $data_ex['title'] != $data['title']) { $data_ex['title'] = $data['title']; } if (!empty($data['ment']) && $data_ex['ment'] != $data['ment']) { $data_ex['ment'] = $data['ment']; } if (!empty($data['name']) && $data_ex['name'] != $data['name']) { $data_ex['name'] = $data['name']; } if (!empty($data['category']) && $data_ex['category'] != $data['category']) { $data_ex['category'] = $data['category']; } if (!empty($data['tag']) && $data_ex['tag'] != $data['tag']) { $data_ex['tag'] = $data['tag']; } delIndex($data_ex['num']); addIndex($data_ex, "\n\t\t\t\tid: {$board_data['no']}\n\t\t\t\tnum: {$data_ex['num']}\n\t\t\t\tdate: {$data_ex['date']}\n\t\t\t\tip: {$data_ex['ip']}\n\t\t\t\ttarget: {$data_ex['target_member']}\n\t\t\t"); } //// 트랙백 보내기 if (!empty($trackback)) { $result = ''; $result = sendTrackback($trackback, $trackback_excerpt, $trackback_charset, $data, $board_data, 'post'); if ($result) { __error("글수정에 성공했지만 트랙백을 보내지 못했습니다. ({$result})"); } } //// 이미지 치환 if (!empty($is_saveImage) && !empty($data['ment'])) { $data['ment'] = saveImage($data_ex['no'], $data['ment'], $board_data); sql("UPDATE {$board_data['table']} SET ment='{$data['ment']}' WHERE no={$data_ex['no']}"); } }
function arr_diff($a1, $a2) { $diff = array(); foreach ($a1 as $k => $v) { $dv = array(); if (is_int($k)) { // Compare values if (array_search($v, $a2) === false) { $dv = $v; } else { if (is_array($v)) { $dv = arr_diff($v, $a2[$k]); } } if ($dv) { $diff[] = $dv; } } else { // Compare noninteger keys if (!$a2[$k]) { $dv = $v; } else { if (is_array($v)) { $dv = arr_diff($v, $a2[$k]); } } if ($dv) { $diff[$k] = $dv; } } } return $diff; }
// compare two different phpinfos $site1 = 'http://example.com/phpinfo.php'; $site2 = 'http://example.com/phpinfo-2.php'; // if required, use curl_website($site1,username,password); $data1 = curl_website($site1); $data2 = curl_website($site2); $array1 = phpinfo_to_array($data1); $array2 = phpinfo_to_array($data2); /* * pull the content, turn it into an array and compare */ echo '<pre>'; #echo '<h1>array1</h1>'; #print_r($array1); // for debugging #echo '<h1>array2</h1>'; #print_r($array2); // for debugging echo '<h1>Compare Two phpinfo() Files</h1>'; echo '<p>Comparison between <span style="color: red;">' . $site1 . '</span> and <span style="color: blue;">' . $site2 . '</span></p>'; // side-by-side comparison echo '<h2>side-by-side comparison</h2>'; foreach ($array1 as $key => $value) { echo '<span style="font-weight: bold;">' . $key . '</span>' . "\n"; echo 'array1: ' . $value . "\n"; echo 'array2: ' . $array2[$key] . "\n"; if ($value != $array2[$key]) { echo '<span style="text-decoration: underline;">diff</span>' . "\n"; echo arr_diff(array($value), array($array2[$key])); } echo "<br />"; } echo '</pre>';
/** * 그룹 수정 * @class admin.site * @param $data: 자료 $no: 대상번호 -is_check: 입력변수 체크 여부 * @return */ function editSite($data, $no, $param = '') { global $mini; $param = param($param); def($param['is_check'], 1); //// 변수 체크 if ($param['is_check']) { checkFieldSite($data); } //// 번호 넣기 if (is_array($no) && isset($data['id'])) { __error('그룹 다중 수정에 아이디 수정이 포함되어 있습니다'); } if (!is_array($no)) { $tmp = $no; $no = array(); $no[0] = $tmp; } //// 수정할 수 없는 정보 제거 unset($data['no']); unset($data['date']); unset($data['mode']); unset($data['script']); //// 넘어오지 않은 변수 처리 if (empty($data['site_link'])) { $data['site_link'] = ''; } foreach ($no as $key => $val) { //// 번호 체크 check($val, 'type:num, name:그룹번호'); //// 데이터 로드 $data_ex = sql("SELECT * FROM {$mini['name']['site']} WHERE no={$val}"); if (!is_array($data_ex)) { __error('해당 그룹이 존재하지 않습니다'); } //// 권한체크 checkAdmin("\n\t\t\t\tsite: {$data_ex['no']}\n\t\t\t\ttype: ajax\n\t\t\t"); //// 기본변수 여부 체크 if (isset($data['name']) && !$data['name']) { __error('그룹 이름을 입력해 주세요'); } //// 이름 중복 체크 if (isset($data['name'])) { if (sql("SELECT COUNT(*) FROM {$mini['name']['site']} WHERE no!={$val} and name='{$data['name']}'")) { __error('중복된 그룹이름 입니다.'); } } //// 쿼리 sql("UPDATE {$mini['name']['site']} SET " . query($data, 'update') . " WHERE no={$val}"); //// 번호 재입력 $data['no'] = $val; //// 로그 기록 addLog(array('mode' => 'site_edit', 'field1' => $data['no'], 'ment' => arr_diff($data_ex, $data))); } }
function obj_diff($new, $old) { // Returns only properties that changed between new and old value $result = new stdClass(); foreach ($new as $key => $value) { // Each value in new if (isset($old->{$key})) { // Key is present in old $oldvalue = $old->{$key}; switch (gettype($value)) { case 'object': $result->{$key} = obj_diff($value, $oldvalue); break; case 'array': $a = arr_diff($value, $oldvalue); if (count($a) > 0) { $result->{$key} = $a; } break; default: if ($value != $old->{$key}) { $result->{$key} = $value; } } } else { // Key not present in old $result->{$key} = $new->{$key}; } // Set as new value } if (count(get_object_vars($result)) == 0) { $result = null; } return $result; }
/** * Computes the diff between two texts, line by line. * The lines are supposed to be separated by a NL ("\n") * @param string $textA The old text * @param string $textB The new text * @param boolean $show_equal If true, the result will also contain the common lines * (default false) * @return array An array of arrays describing the diff * @see arr_diff for the return value */ function text_diff_by_lines($textA, $textB, $show_equal = false) { return arr_diff(explode("\n", $textA), explode("\n", $textB), $show_equal); }
/** * 게시판 수정 * @class admin.board * @param $data: 자료 $no: 대상번호 -is_check: 입력변수 체크 여부 * @return */ function editBoard($data, $no, $param = '') { global $mini; $param = param($param); def($param['is_check'], 1); //// 변수 체크 if ($param['is_check']) { checkFieldBoard($data); } //// 번호 넣기 if (is_array($no) && isset($data['id'])) { __error('게시판 다중 수정에 아이디 수정이 포함되어 있습니다'); } if (!is_array($no)) { $tmp = $no; $no = array(); $no[0] = $tmp; } //// 수정할 수 없는 정보 제거 unset($data['no']); unset($data['dir']); unset($data['date']); unset($data['mode']); unset($data['script']); //// 넘어오지 않은 변수명 처리 if (empty($data['field'])) { $data['field'] = ''; } if (empty($data['site_link'])) { $data['site_link'] = ''; } foreach ($no as $key => $val) { //// 번호 체크 check($val, 'type:num, name:게시판번호'); //// 데이터 로드 $data_ex = sql("SELECT * FROM {$mini['name']['admin']} WHERE no={$val}"); if (!is_array($data_ex)) { __error('해당 게시판이 존재하지 않습니다'); } //// 권한체크 checkAdmin("\n\t\t\t\tsite: {$data_ex['site']}\n\t\t\t\tboard: {$data_ex['no']}\n\t\t\t\ttype: ajax\n\t\t\t"); //// 아이디 중복 체크 if (isset($data['id'])) { check($data['id'], 'type:id, name:게시판아이디'); if (!preg_match("/[^0-9]/", $data['id'])) { __error('게시판 아이디에 숫자만 입력하실 수 없습니다.'); } if (sql("SELECT COUNT(*) FROM {$mini['name']['admin']} WHERE no!={$val} and id='{$data['id']}'")) { __error('중복된 게시판 아이디 입니다.'); } } //// 기본변수 여부 체크 if (isset($data['name']) && !$data['name']) { __error('게시판 이름을 입력해 주세요'); } if (isset($data['skin']) && !$data['skin']) { __error('스킨을 선택해 주세요'); } if (isset($data['site']) && !check($data['site'], 'type:num')) { __error("그룹을 선택해 주세요"); } //// 쿼리 sql("UPDATE {$mini['name']['admin']} SET " . query($data, 'update') . " WHERE no={$val}"); //// 번호 재입력 $data['no'] = $val; //// 로그 기록 addLog(array('mode' => 'board_edit', 'field1' => $data['no'], 'ment' => arr_diff($data_ex, $data))); } }
} $old_array = explode("\n", $second); $new_array = explode("\n", $first); } $old_array = explode("\n", $second); $new_array = explode("\n", $first); // diff-methode festlegen if ($environment["parameter"][7] != "") { $diff_type = $environment["parameter"][7]; } else { $diff_type = $cfg["contented"]["diff_engine"]; } if ($diff_type == "phpdiff3") { $diff = phpdiff3($second, $first); } elseif (strstr($diff_type, "phpdiff")) { $diff = arr_diff($old_array, $new_array); } else { $diff = new Text_Diff('auto', array($old_array, $new_array)); $renderer = new Text_Diff_Renderer_inline(); $diff = str_replace("\n", "<br>", $renderer->render($diff)); } $ausgaben["diff"] = $diff; } // form options holen $form_options = form_options(eCRC($environment["ebene"]) . "." . $environment["kategorie"]); // form elememte bauen $element = form_elements($cfg["contented"]["db"]["leer"]["entries"], $form_values); // form elemente erweitern $element["extension1"] = "<input name=\"extension1\" type=\"text\" maxlength=\"5\" size=\"5\">"; $element["extension2"] = "<input name=\"extension2\" type=\"text\" maxlength=\"5\" size=\"5\">"; // +++
/* Сюда приходит POST'ом следующее: act - что нужно делать */ try { switch ($_POST['act']) { case 'newGroup': $result['gid'] = add_group($_POST['tokens'], (int) $_POST['type']); break; case 'copyGroup': $old_groups = get_groups_by_sentence((int) $_POST['sentence_id'], (int) $_SESSION['user_id']); $new_group_id = copy_group((int) $_POST['gid'], (int) $_SESSION['user_id']); $new_groups = get_groups_by_sentence((int) $_POST['sentence_id'], (int) $_SESSION['user_id']); $result['new_groups'] = array(); $result['new_groups']['simple'] = arr_diff($new_groups['simple'], $old_groups['simple']); $result['new_groups']['complex'] = arr_diff($new_groups['complex'], $old_groups['complex']); break; case 'deleteGroup': delete_group($_POST['gid']); break; case 'setGroupHead': set_group_head($_POST['gid'], $_POST['head_id']); break; case 'setGroupType': set_group_type($_POST['gid'], $_POST['type']); break; case 'getGroupsTable': // Решил это вынести в аякс, потому что перерисовывать такую // табличку на клиенте - сложно, не используя шаблонизатор. // TODO: проверка, свое ли спрашивает пользователь require_once 'Smarty.class.php';
if (count($page)) { $smarty->assign($page); if ($r1 && $r2 && $r1 != $r2) { if ($r1 > $r2) { $a1 = getRevisionArray($page['article_id'], intval($r2)); $a2 = getRevisionArray($page['article_id'], intval($r1)); } else { $a1 = getRevisionArray($page['article_id'], intval($r1)); $a2 = getRevisionArray($page['article_id'], intval($r2)); } if (count($a1) > count($a2)) { $a2 = array_pad($a2, count($a1), ''); } elseif (count($a1) < count($a2)) { $a1 = array_pad($a1, count($a2), ''); } $smarty->assign_by_ref('output', arr_diff($a1, $a2, 1)); } } else { $template = 'static_404.tpl'; } } else { $smarty->assign('user_id', $page['user_id']); $smarty->assign('url', $page['url']); } $smarty->display($template, $cacheid); function getRevisionArray($aid, $revid) { global $db, $isadmin, $USER; $prev_fetch_mode = $ADODB_FETCH_MODE; $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; $page = $db->getRow("\r\n\tselect category_name,url,title,extract,licence,approved,user.realname as modifier_realname,content,update_time\r\n\tfrom article_revisions \r\n\t\tinner join user on (modifier = user.user_id)\r\n\t\tleft join article_cat on (article_revisions.article_cat_id = article_cat.article_cat_id)\r\n\twhere ( (licence != 'none' and approved > 0) \r\n\t\tor user.user_id = {$USER->user_id}\r\n\t\tor {$isadmin} )\r\n\t\tand article_id = {$aid}\r\n\t\tand article_revision_id = {$revid}");