Demo


	/**
	 * データからINSERTとUPDATEのSQL文を生成する
	 * @param string $tbl_name テーブル名
	 * @param array $data エンティティ配列型のデータ
	 * @return array|string[][]
	 */
	private function createInsertAndUpdate($tbl_name, $data){
		if(empty($data)) return array();
		
		// 列名群文字列を組み立て
		$ent0 = current($data);
		$keys = array_keys($ent0);
		$clms_str = implode(',', $keys); // 列名群文字列
		
		$inserts = array(); // INSERT SQLリスト
		$updates = array(); // UPDATE SQLリスト
		foreach($data as &$ent){
			
			
			// IDが空ならINSERT文を組み立て
			if(empty($ent['id'])){
				$inserts[] = $this->makeInsertSql($tbl_name, $ent); // INSERT文を作成する
			}
			
			// IDが存在すればUPDATE文を組み立て
			else{
				$updates[] = $this->makeUpdateSql($tbl_name, $ent); // UPDATE文を作成する
			}
		}
		unset($ent);
		
		$res = [
				'inserts' => $inserts,
				'updates' => $updates,
		];
		return $res;
	}
	
	
	/**
	 * INSERT文を作成する
	 * @param string $tbl_name テーブル名
	 * @param array $ent 登録データのエンティティ
	 * @return string INSERT文
	 */
	private function makeInsertSql($tbl_name, &$ent){
		
		$clms_str = '';
		$vals_str = '';
		foreach($ent as $field => $value){
			if($value === null) continue;
			$clms_str .= $field . ',';
			$vals_str .= "'{$value}',";
		}
		
		// 末尾の一文字であるコンマを削る
		$clms_str = mb_substr($clms_str,0,mb_strlen($clms_str)-1);
		$vals_str = mb_substr($vals_str,0,mb_strlen($vals_str)-1);
		
		$insert_sql = "INSERT INTO {$tbl_name} ({$clms_str}) VALUES ({$vals_str});";
		return $insert_sql;
	}
	
	
	/**
	 * UPDATE文を作成する
	 * @param string $tbl_name テーブル名
	 * @param array $ent 登録データのエンティティ
	 * @return string UPDATE文
	 */
	private function makeUpdateSql($tbl_name, &$ent){
		if(empty($ent['id'])) throw new Exception('makeUpdateSql: idが空です。');
		
		$vals_str = '';
		foreach($ent as $field => $value){
			if($value === null) continue;
			$vals_str .= "{$field}='{$value}',";
		}
			
		$vals_str = mb_substr($vals_str,0,mb_strlen($vals_str)-1);// 末尾の一文字であるコンマを削る
		
		$update_sql = "UPDATE {$tbl_name} SET {$vals_str} WHERE id={$ent['id']}";
		
		return $update_sql;
	}

出力

array(2) {
  ["inserts"]=>
  array(3) {
    [0]=>
    string(97) "INSERT INTO tanukis (tanuki_name,tanuki_date,kemono_id) VALUES ('赤ダヌキ','2019-4-9','101');"
    [1]=>
    string(95) "INSERT INTO tanukis (tanuki_name,tanuki_date,kemono_id) VALUES ('ビッグダヌキ','','103');"
    [2]=>
    string(75) "INSERT INTO tanukis (tanuki_name,kemono_id) VALUES ('緑のタヌキ','0');"
  }
  ["updates"]=>
  array(3) {
    [0]=>
    string(105) "UPDATE tanukis SET id='2',tanuki_name='アオダヌキ',tanuki_date='2019-4-8',kemono_id='100' WHERE id=2"
    [1]=>
    string(103) "UPDATE tanukis SET id='3',tanuki_name='黒ダヌキ',tanuki_date='2019-4-10',kemono_id='102' WHERE id=3"
    [2]=>
    string(69) "UPDATE tanukis SET id='4',tanuki_name='ニホンタヌキ' WHERE id=4"
  }
}