PHP が CSV データを mysql データベースにインポートする_PHP チュートリアル
クラスインポート{
var $csv_fields=array(); // CSV 内の注目すべきフィールド...
var $csv_file; //開くファイル
var $csv_data; //ファイル内のデータ
var $csv_array = array(); // ファイル内のデータの配列
var $csv_all_fields = array(); //csv ファイル内のすべてのフィールド名
var $csv_data_all = array(); //すべてのデータ
var $csv_data_keyed = array(); //すべてのデータ
var $tmp_array=array();
var $mysql_array=array();
var $table; //
に挿入するテーブル var $mysql_link; //データベース
var $instructions=array(); //SQL とデフォルト設定
var $instruct_functions = array(); //関数呼び出し
var $debug=0; // デバッグ情報を表示します - ステップバイステップのメッセージ
var $return_debug=0; // デバッグ情報をエコーする代わりに返します
var $vals_per_insert=100; //SQL の insert ステートメントごとに追加する値の数
var $format="linux";
var $linebreak_char="n";
var $delimit_char = ",";
var $use_external_csv_header_file = 0;
var $external_headers ="";
function Import(){
echo "n";
return(TRUE);
}
var $resetProgress=0;
function replace_class_state(){
$this->dmsg("クラスをリセットしています状態", 2);
$this->csv_data_all = array();
$this->csv_fields = array();
$this->csv_data_keyed = array();
$this->tmp_array = array();
$this->mysql_array = array();
$this->instructions = array();
$this->instruct_functions = array();
$this->error_messages = "" ;
$this->output_sql = "";
$this->resetProgress=1;
$this->dmsg("新しいテーブルとデータ定義の準備ができました", 2);
}
function set_delimit_char( $ch){
$this->delimit_char = $ch;
$this->dmsg("区切り文字を $ch に設定する", 2);
}
関数 debug($d=0,$r= 0){
$this->debug=$d;
$this->return_debug=$r;
}
var $y=1;
var $error_messages="";
var $debug_level = 1;
function set_debug_level($dl=1){
$this->debug_level = $dl;
}
function dmsg($string, $dlvl=1){
global $PHP_SELF;
//デバッグレベル - 1- 4 //1 はステータス メッセージのみ - 4 は完全なデバッグです
if($dlvl debug_level){
if($this->debug){
if(!$this->return_debug ){
if($PHP_SELF){
echo "• ".$string."
n";
}else{
echo "n# $string ";
}
}else{
$this->error_messages .="# $string
n ";
}
$this->y++;
}
}
}
var $terminal_width=100;
var $queries_per_dot = 20;
関数 progress_guess(){
$calculations_to_per form = `wc -l $this ->csv_file`;
$funcs_per_row = count($this->instruct_functions);
$total_function_calls = $calculations_to_perform * $funcs_per_row;
$this->queries_per_dot =round($total_function_calls / 100);
$this- >dmsg("functions: $total_function_calls 実行される関数呼び出し - $this->queries_per_dot のドットあたりの呼び出し数", 3);
}
function set_terminal_width($w){
$this->terminal_width= $w;
}
function set_resetProgress($on=1){
$this->resetProgress=1;
}
function show_progress_meter(){
static $count=0;
static $first=1; $ticker=0;
if($this->resetProgress){
$count=0;
$first=1;
$ticker=0;
$this->リセット進行=0;
}
if($this->debug){
if($count == 0 && $first){
echo "n#";
$first=0;
}
if($count > $this- >terminal_width ){
echo "n#";
$count=0;
}
//ドットごとのクエリ
if($ticker == $this->queries_per_dot){
echo ".";
$ticker =0;
$count++;
}else{
$ticker++;
}
}
}
functionblank_error_messages(){
$this->error_messages = "";
}
function get_error_messages(){
戻る($this->error_messages);
}
function add_field_alias($csv_field, $mysql_field){
//要素を配列に追加
$this->csv_fields[$csv_field] = $mysql_field;
if( ereg( "^TMP__", $mysql_field)){
$this->dmsg("一時フィールド エイリアス $csv_field --> $mysql_field", 2);
}else{
$this->dmsg("addedフィールド エイリアス $csv_field --> $mysql_field", 2);
}
}
//read_csv_file を呼び出した後にのみこれを呼び出します。そうしないと配列が欠落します。
//また、create_csv_data_array() が呼び出された後にのみ呼び出してください。 add_field_alias の初期値の場合。
//そうでない場合、これらのフィールドは最後の配列から欠落していますが、警告は表示されません。 :(
function dedicated_field($csv_field, $mysql_field){
if(!is_array($this->mysql_array)){
echo "最初に read_csv_file($file) を実行して、必要な配列を作成します"; die();
}
reset($this->mysql_array);
while(list($key, $this->field) = each($this->mysql_array)){
$this->mysql_array[$key ][$mysql_field] = $this->csv_data_all[$key][$csv_field];
}
reset($this->mysql_array);
$this->dmsg("重複したフィールド $csv_field --> ; $mysql_field", 1);
}
function use_external_headers($headerfile){
$this->dmsg("$headerfile から外部 CSV ヘッダーを読み込みます。", 2);
if(file_exists($headerfile) )){
$fd = fopen($headerfile, "r");
$this->gt;external_headers = fread($fd, filesize($headerfile));
$this->gt;external_headers = トリム($this- >external_headers);
fclose($fd);
$this->use_external_csv_header_file = 1;
}else{
$this->dmsg("エラー - CSV ヘッダー ファイル $headerfile が存在しません!" );
die();
}
$this->dmsg("Got headers:n $this->external_headers", 2);
}
//クリーンなファイルは、カンマ引用符とアポストロフィを安全な代替文字に置き換えます -
//create_sql はエイリアスについて認識しており、最終的な SQL 出力でそれらを反転します
function clean_file($text){
$rows =explode($this->linebreak_char,$text);
$return = "";
while (list($key,$val)=each($rows)){
//カンマのアポストロフィーと引用符を置き換えます....これらはcreate_sql関数で適切な値に戻されます
$val = preg_replace("/," (.*)([,])(.*)",/", ',"1,3",', $val, -1);
$val = str_replace("""", ""e;" , $val);
$val = str_replace("'", "&appos;", $val);
$return .= $val."n";
}
return($return);
}
var $pages = array();
function find_xls_pages($file){
$command = " xlhtml -dp -asc $file";
$xls_detail = `$command`;
$this->dmsg($xls_detail) ;
}
//関数は xls ファイルを読み取り、そこから必要な配列を作成できます (xlhtml アプリケーションを使用して /tmp に csv を作成します)
関数 read_xls_file($file){
// xlhtml を使用して変換します...
$this- >dmsg("xlhtml がインストールされているかどうかを確認しています...", 3);
$xlhtml_check = `どの xlhtml 2>>/dev/null`;
if(strlen($xlhtml_check)==0){
$this- >dmsg("xls ファイルを csv2mysql に直接インポートできるようにするには、xlhtml をインストールする必要があります", 1);
die("n# Script Endedn");
}
$this->dmsg("$xlhtml_check") ;
$tmpfilename="/tmp/TMPCSV2MYSQL.CSV";
$this->find_xls_pages($file);
$command = "$xlhtml_check -csv -xp:0 $file > $tmpfilename";
$this->dmsg("実行中のコマンド $command");
exec($command);
$this->read_big_csv_file($tmpfilename);
}
var $fd;
function read_csv_file($file){
//より良い関数を呼び出します - ファイルを 1 行ずつ読み込みます
$this->read_big_csv_file($file);
}
var $buffer;
var $csvfields;
var $csv_all_possible_fields = array();
var $ csvFields = array();
function read_big_csv_file($file){
$this->dmsg("csv ファイルからデータを読み取る: $file", 1);
$this->>csv_file = $file;
if (!$this->fd=fopen($this->csv_file, "r")){
echo "CSV ファイルを開けませんnn"; die();
}
/*
$x=0;
while(!feof($this->fd)){
$this->buffer = fgets($this->fd, 4096) ;
$this->csv_data .= $this->buffer;
$x++;
}
*/
//data という配列を作成します....
while($data = fgetcsv($this->fd, 1000, $this->delimit_char)){
$num = count( $data);
$count=1;
foreach($data as $cell){
$cell = str_replace(""", ""e;", $cell);
$cell = str_replace("'", " &appos;", $cell);
$cell = str_replace(",", ",", $cell);
$this->csv_data .= $cell;
if($count $ this-> csv_data。= $ $ this-> delimit_char; ->csv_data);
//クリーンなファイルは、カンマ引用符とアポストロフィーを安全な代替文字に置き換えます -
//create_sql はエイリアスを認識し、最終的な SQL 出力でそれらを反転します
//$this->csv_data = $this ->clean_file($this->csv_data);
//外部ヘッダー ファイルを使用している場合は、簡略化のために、読み取りデータの先頭にヘッダーを追加します...
$this->csv_data = $this->external_headers."n".$this->csv_data;
}
/* フィールド名の配列を作成します */
$this->csvfields =explode($this->linebreak_char, $this->csv_data);
$this->csv_all_possible_fields = $this ->csvfields[0];
//これらをカンマで分解します
$this->csvfields =explode($this->delimit_char, $this->csv_all_possible_fields);
foreach($this->csvfields as $field){
$this->csvFields[] =addslashes($field);
}
$this->dmsg("csv ファイルからのデータの読み取りが完了しました", 2);
}
var $tmp;
function set_format($format){
$this->format = $format;
if($format == "win"){
$this->linebreak_char = "rn";
$ this->tmp = "rn";
}else{
$this->linebreak_char = "n";
$this->tmp = "n";
}
//$this->dmsg( "改行形式を ".addslashes($this->linebreak_char) に設定しました);
$this->dmsg("改行形式を $this->tmp に設定しました", 2);
}
var $行;
var $stripQuotes = 1;
function setStripQuotes($on=1){
$this->stripQuotes = $on;
}
//関数は csv_data_all 配列を作成します - 値を保持する CSV フィールド名をキーにします。
関数create_csv_data_array(){
if(empty($this->csv_data)){
echo "CSV ファイル $this->csv_filen にデータがありません"; die();
}
$this->lines = array();
$this->csv_data_all = array();
$this->dmsg("データ配列の作成を開始しました", 1) ;
$this->lines =explode($this->linebreak_char, $this->csv_data);
foreach($this->lines as $line){
if(!empty($line)) {
$values =explode($this->delimit_char, $line);
//文字列を囲む「」タグを削除します...
foreach($values as $k=>$v){
if( $this->stripQuotes){
$len = strlen($v)-1;
//最初と最後の文字は引用符ですか?
$v =tripslashes($v);
if(ereg("^". +"$", $v)){
//その場合はスペースに置き換えて削除してください
//$v[0] = " ";
//$v[$len] = " ";
//$v = トリム($v);
//$v = str_replace(""", "", $v);
}
}
$v = str_replace(""", "", $ v);
//$values[$k] =addslashes($v);
$values[$k] = $v;
}
$this->csv_array[] = $values;
}
}
$this->csv_all_fields = $this->csv_array[0];
//これは CSV 定義なので 1 行目をスキップし、配列を実行します -
// のフィールド名をキーとした新しい配列を作成しますcsv と値
$count=0; を保持します。
reset($this->csv_array);
while(list($foo,$el)=each($this->gt;csv_array)){
if($count>0){
foreach($el as $ key=>$val){
$this->csv_data_keyed[$this->csv_all_fields[$key]]=$val;
}
$ this-> csv_data_all [] = $ $ this-> csv_data_keyed;初期データアレイ "、2);
$ this-> convert_array_to_mysql_keys();
}
関数function convert_array_to_mysql_keys(){
reset($ this-> csv_data_all);データ配列", 2);
//指定されたすべてのフィールドをループします - 指定されたエイリアスをキーとした新しい配列を作成します。
reset($this->csv_data_all);
while(list($foo,$data)=each ($this->csv_data_all)){
foreach($this->csv_fields as $key=>$field){
$this->tmp_array[$field] = $data[$key];
}
$this->mysql_array[] = $this->tmp_array;
}
reset($this->csv_data_all); }
var $sql;
var $result;
var $tbl_struction;
var $mysqlFields = array();
//挿入するデータベース テーブルを指定します....
function specify_table($table){
$this->table = $table;
$this->dmsg("データベーステーブル $table を見る", 2);
$this->sql = "desc $this->table";
$this->result = mysql_query($ this->sql, $this->mysql_link) または die(mysql_error());
while($rows = mysql_fetch_array($this->result, MYSQL_ASSOC)){
$this->tbl_struction[] = $行;
$this->mysqlFields[] = $rows['Field'];
}
$this->dmsg("finished looking at table $table", 2);
}
//静的エイリアスを追加します- フィールド「foobar」に常に「hello」と表示させたい場合は、 add_static_alias("foobar", "hello");これをすべての行に対して実行します
function add_static_alias($field, $value){
$this->add_db_instruction($field, $value);
}
//特定のフィールドに SQL 命令を追加します
function add_db_instruction( $field, $sql, $key=""){
$instruct['field'] = $field;
$instruct['sql'] = $sql;
$instruct['select_key'] = $key;
$this->instructions[]=$instruct;
$this->dmsg("$field の db 命令または静的エイリアスを追加しました", 2);
$this->set_resetProgress();
}
function add_function_instruction($field, $functionname, $args){
$instruct['field'] = $field;
$instruct['function_name'] = $functionname;
$instruct['args'] = $args;
$this->instruct_functions[] = $instruct;
$this->dmsg("$field の関数命令を追加", 2);
$this->set_resetProgress();
}
//実行関数命令
var $call;
function get_function_instruction_values(){
$this->gt;progress_guess();
$this->dmsg("関数命令の値の計算", 2);
reset($this->gt; mysql_array);
while(list($key,$element)=each($this->mysql_array)){
foreach($this->instruct_functions as $function){
$this->call = "$function_result = ".$function['function_name'];
//値を計算するために引数を分割します...
$args =explode(",", $function['args']);
$arg_call = "";
$num_args = count($args)-1;
$count=0;
//引数の値を取得します
foreach($args as $arg){
$arg =rim($arg) ;
$arg_call.=""".$element[$arg].""";
if($count $arg_call .= ",";
}
$count++;
}
//関数の末尾に引数の値を追加します
$this->call.="(".$arg_call.");";
//作成された関数呼び出しを評価します - 変数 function_result に戻り値が設定されます
//die ($this->call);
$this->dmsg("関数命令の実行 : $this->call", 4);
$this->show_progress_meter();
eval($this-> ;call);
//mysql_array に値を追加します
$this->mysql_array[$key][$function['field']] = $function_result;
}
}
reset($this-> mysql_array);
}
//db 命令を実行
var $product_id;
function get_instruction_values(){
$this->dmsg("db 命令の値を計算しています", 2);
reset($this- >mysql_array);
while(list($key,$element)=each($this->mysql_array)){
foreach($this->instructions as $ins){
if(eregi("SELECT", $ins['sql'])){
$ins['sql'] =tripslashes($ins['sql' ]);
$this->select_key = $ins['select_key'] ;
//まだ値を取得していない場合...
if(!isset($this->mysql_array[$key ][$ins['field']])){
$this->mysql_array[$key][$ins['field']] = $this->run_sql_query($ins['sql'], $ element[$this->select_key]);
}
}else{
$this->mysql_array[$key][$ins['field']] = $ins['sql'];
}
}
$this->show_progress_meter();
}
reset($this->mysql_array);
}
var $runsql;
var $dbrows;
var $dbkey;
//あなたが思っていることとは違います関数 -- これはコードを評価するためのものです - 命令のためのものです。
//TODO 関数の名前を、より優れた機能を反映した論理的な名前に変更します。
function run_sql_query($sql, $dbkey){
$this->runsql =tripslashes($sql);
$this->dbkey = $dbkey;
//コードを this->runsql に評価します -
//これにより、dbkey に文字列ではなく値が入力されます
eval("$this->runsql = "$this ->runsql";");
$this->dmsg("running sql query..$this->runsql", 4);
//クエリを実行して結果を返す
$this->result = mysql_query($this->runsql, $this->mysql_link) または die(mysql_error());
while($rows = mysql_fetch_array($this->result, MYSQL_ASSOC)){
$this-> ;dbrows = $rows['結果'];
$this->dmsg("$this->runsql returns: $this->dbrows", 4);
}
$this->dmsg("$this->runsql returns: $this ->dbrows", 4);
return($this->dbrows);
}
//データベースに接続します
function db_connect($host, $user, $pass, $db){
$ this->dmsg("データベースに接続中", 2);
$this->mysql_link = mysql_pconnect("$host", "$user", "$pass") または die(mysql_error());
if ($this->mysql_link){
mysql_select_db($db);
}
}
var $specified_fields=array();
var $sql_error=0;
var $error_fields = array();
//テーブルに必要なすべてのフィールドが存在し、正しいことを確認してください....
function validate_sql(){
$this->dmsg("SQL を生成する配列要素を検証しています", 1);
reset($this ->mysql_array);
//配列内の要素をステップ実行します。foo は未使用の変数です。
while(list($foo,$this->element)=each($this->mysql_array)){
//ここでは foreach を気にしないでください - 遊ぶための小さな配列...
foreach($this->element as $this->field=>$val){
//以下のフィールド名の配列を作成します指定されています...
if(!in_array($this->field, $this->specified_fields)){
$this->specified_fields[] = $this->field;
}
}
}
reset($this->mysql_array);
//エラーが発生するとこれが真になり、下のダイが生き返ります...
$this->sql_error=0;
//テーブルのフィールドをループします - 配列
foreach ($this->tbl_struct as $this->field)を作成します{
//フィールドが指定されたフィールドの配列内になく、デフォルト値がない場合
// 問題のフィールドが主キーではない場合 - moan
if(!in_array($this->field['Field '], $this->specified_fields)
&& ($this->field['Default']=="")
&& ($this->field['Key'] != 'PRI')
&& ($this->field['Extra'] != 'auto_increment')
&& ($this->field['NULL'] != "YES" ) ){
$this->dmsg( "{$this->field['Field']} にはデフォルトがなく、このフィールドの値が指定されていません。", 1);
$this->gt;sql_error=1;
$this->error_fields[] = $this->field['フィールド'];
}else{
$this->dmsg( "{$this->field['フィールド']} は", 4);
}
}
#この VAR が設定されている場合、何かエラーが発生しました - メッセージを添えて報告してください。
if($this->sql_error){
echo $this->error_messages;
$this->csv_data_all = array();
if(function_exists("render_page_head")){
echo render_page_head();
}
$erst="";
foreach($this->error_fields as $ f){
$erst.="フィールド ".$f." にはデフォルトはありません
";
}
die("n$erst 不足しているフィールドの値を指定してください。これらのフィールドの定義を追加してください。") ;
}
}} var $ element;
var $ output_sql; ){
//すべての配列要素が存在し、正しいことを確認してください...
$this->validate_sql();
$this->dmsg("creating sql", 1);
#TODO:これはあまり賢いメモリ管理ではありません - 各値行を作成しない方が良いです
# +Bでマシンを回復!!!!
$this->values = "";
//入力する各行をループします
reset($this->mysql_array); $this->all_values = array();
while(list( $foobar,$this->element)=each($this->mysql_array)){
//各フィールド名と値をループします
$num=count($this->element)-1;
$x=0;
//空白のデータ
$this->insert_into = "";
$this->values = "(";
foreach($this->element as $field=>$ val){
if(!ereg("^TMP__", $field )){
$val = str_replace(""e;", """ , $val);
$val = str_replace(",", ",", $val);
$val = str_replace("&appos;", "'", $val);
$this->insert_into .= $field." ";
$this->values .= "'$val' ";
$this->insert_into.=" ,";
$this->values .= ", ";
}
}
$x++;
}
$this->values .= ")";
$this->all_values[] = $これ->値;
}
//SQLの挿入行を作成します
$this->insert_line = "REPLACE INTO $this->table ( $this->insert_into ) VALUESn ";
$this->output_sql = $ this->insert_line;
$num=count($this->all_values)-1;
$x=0;
$i=1;
// VALUES のリストをループします "(bla,bla ,bla)" を配列で SQL にそれぞれ追加します
//vals_per_insert に達したら SQL ステートメントを閉じて別の挿入行を追加します
reset($this->all_values);
while(list($foo,$v)= each($this->all_values)){
//挿入ステートメントごとに指定された数の値のみを追加します (vals_per_insert)
if($i== $this->vals_per_insert){
$this->output_sql . = $v.";nn".$this->insert_line;
$i=1;
}
else{
$this->output_sql .= " $v ";
if($x $this->output_sql .= ",n";
}
}
$x++;
$i++;
}
reset($this->all_values);
reset($this->mysql_array);
// SQL ステートメントを終了します
$this->output_sql .= "; ";
if($show){
echo "n#################################### #####################n";
echo "# Csv2MySQL.1.1.inc によって作成された SQL n";
echo "# CyBeRtIlL レガシーインポートツール n";
echo "# ".date("D d-m-Y H:i:s", time())."n";
echo "# CSV ファイル: $this->csv_file n";
echo "#### ################################################ ####n";
echo "nn".$this->output_sql."n";
}
else{
return($this->output_sql);
}
}
var $keys;
//ちょっとしたデバッグ関数
function show_settings($tbl=1, $return=0){
if(!$tbl){
ds($this->mysql_array);
#BELOW ARE JUST MOREデバッグ用のオプションのダンプ
//ds($this->csv_fields);
//ds($this->csv_data_all);
//ds($this->tbl_struction);
//ds($this ->手順);
//echo nl2br($this->output_sql);
}else{
if(!$return){
#DEBUG JARGON - "知っている人向け" ;)
echo "";
$d=新しいディスプレイ($this->csv_data_all);
$d->make_layout(1);
$d=新しいディスプレイ($this->mysql_array);
$d-> ;make_layout(1);
#オプションのデバッグダンプ
//$d=新しいディスプレイ($this->手順);
//$d->make_layout(1);
//$d=新しいディスプレイ($this->instruct_functions);
//$d->make_layout(1);
//$d=new display($this->tbl_struct);
//$d->make_layout(1) );
//echo nl2br($this->output_sql);
echo "";
}else{
#関数呼び出し元にデータを返す...
//配列キーを取得します
$keys = array_keys($this->mysql_array[0]);
$this->keys = $keys;
//キーを通過します - 大きな配列から 5 行を取得します - これは、関数などの追加中にユーザーが何を行っているかをユーザーに表示するためです -
// 潜在的に数千行を消費することはありません...
foreach( $keys as $key){
$x=0;
while($x $sample[$x][$key] = $this->mysql_array[$x][$key];
$x++;
}
}
$d=新しいディスプレイ($sample);
$string = $d->make_layout(0);
return("
".$string."> ;");
}
}
}
関数 return_csv_fields(){
return($this->csvFields);
}
関数 return_mysql_fields(){
return($this->mysqlFields);
}
//return(array_keys($this->mysql_array[0]));
return($this->keys);
}
}
???
//////// クラスに渡すサンプル配列 //////////
/*
$stuff = array("0" => array(
"product_id" => " 00001",
"actual_unit_cost" => "99.99",
"retail_unit_cost" => "124.99",
"数量" => "5"
),
"1" => array(
"product_id; " => "00002",
"actual_unit_cost" => "699.99",
"retail_unit_cost" => "750.00",
"数量" => "3"
)
);
*/
クラス表示 {
var $widths = array();
var $biggest = array();
var $data = array();
var $dis;
var $divider;
var $rows;
var $emptyset =FALSE;
var $write; //出力をエコーします
var $ascii_output;
var $finalhtmltable;
var $stylesheet;
var $borderwidth = 0;
var $bordercolor = "#000000";
var $cellpadding = 2;
var $cellspacing = 1;
function Calculate_widths($array){
if(empty($array)){
//表示するデータがあることを確認してください
$this->emptyset=TRUE;
return(false);
}
//各行をループします
$this->data = $array;
$x=0;
if(is_array($array)){
foreach($array as $a){
while(list( $key, $val) = each($a)){
$this->widths[$x][$key] = strlen($val);
}
++$x;
}
}
$ this->biggest = $this->get_longest_only();
return($this->widths);
}
function get_longest_only(){
$x=0;
$array = $this-> widths;
foreach($array as $a){
while(list($key, $val) = each($a)){
if($val > $this->biggest[$key] || empty($this->biggest[$key])){
$this->biggest[$key] = $val;
}
if(strlen($key) > $this->biggest[$ key]){
$this->biggest[$key] = strlen($key);
}
}
++$x;
}
return($this->biggest);
}
関数make_layout($write=1){
$this->write = $write;
if($this->emptyset){
return("空のセット (0.00 ふふふ)n");
}
$first= "+";
while(list($key, $val) = each($this->biggest)){
$dis.="+";
for($x=0;$xbiggest [$key];$x++){
$first .= "-";
}
$first.="+";
$s="|".ucwords(str_replace("_", " ",$key ));
if(strlen($s)biggest[$key]){
for($x=strlen($s);$xbiggest[$ key];$x++){
$s.=" ";
}
}
$second.=$s;
}
$this->divider = $first;
$re = $first."n" .$sec."|n".$first."n";
$re.=$rows;
$this->rows = $this->make_body();
$re.=$this->rows;
if($this->write){
//出力をウェブページに書き込みます
//echo "
".$re."";
echo "".$re."";
}
$this->ascii_out = $re;
return($re );
}
function create_stylesheet($bg="ededed", $fontcol="000000", $fontsize="x-small", $bg2="444444", $fontcol2="ffffff", $fontsize2=" x-small"){
$this->stylesheet = "
";
}
function make_body(){
if(is_array($this->data)){
foreach($this->data as $row){
while(list( $key, $val)=each($row)){
if(is_array($val)){
$out[0]=$val;
$tr = 新しいディスプレイ($out);
$tr- >make_layout(0);
$tr->set_borderwidth($this->gt;borderwidth);
$tr->set_cellpadding($this->cellpadding);
$tr->set_cellspacing($this- >セル間隔);
$tr->set_bordercolor($this->bordercolor);
$val = "
".$tr->make_html_table()." |
}
$ r .= "|".$val;
if(strlen($val)biggest[$key]){
for($x=strlen($val);$x biggest[$key]; $x++){
$r.=" ";
}
}
$r.="|n";
}
}
$r.=$this- >divider."n";
return($r);
} function get_divider(){
return($this->divider);
}
function display($stuff){
//constructor function
$this->widths = $this->> Calculate_widths($stuff);
}
$this->borderwidth = $wid;
}
$this->cellpadding=$pad;
}
function set_cellspacing($spac){
$this->cellspacing=$spac;
}
$this->bordercolor=$col;
}
function make_html_table( ){
//ASCII 表示を適切な HTML テーブルに変換します
$text = $this->ascii_out;
$rows =explode("n", $text);
$x=0;
foreach($rows as $row){
$last = strlen($row);
$class = "column-data";
if($x==1){
$class = "テーブルヘッダー";
}
if(!ereg("^+-*", $row) && strlen($row)>0){
$row = "
$row .= "
$row = str_replace("+", "
$row = str_replace("| ", "
$row = str_replace("
$row = str_replace("
$htmloutput.=$row;
}
$x++;
}
$style = $this->stylesheet;
$htmloutput = $style."n
$this->finalhtmltable = $htmloutput;
return($htmloutput);
}
function returnhtml(){
return($this->finalhtmltable);
}
function parsehtml(){
echo $this->finalhtmltable;
}
}
//$t =新しいディスプレイ($stuff);
//$t->make_layout(0);
//echo $t->make_html_table();
/*
$d = 新しいディスプレイ($stuff);
$ d->make_layout(0);
$d->set_borderwidth(0);
$d->set_cellspacing(1);
$d->set_cellpadding(2);
$d->make_html_table( );
$d->parsehtml();
*/
?>

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

Dreamweaver Mac版
ビジュアル Web 開発ツール

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール
