Use Spatial Join tool.
Joins attributes from one feature to another based on the spatial relationship. The target features and the joined attributes from the join features are written to the output feature class.
target_features: Point FC
join_features: Polygon FC
join_operation: One_To_Many
join_type: Keep_All
match_option: It's depend on your project( Contains, Completely Contains and Intersect are suitable based on the shape types)
Look at the Pivot table. It can be help you without scripting.
Spatial join output remains join and target id's. Point id's(JOIN_FID) and Polygon id's(TARGET_FID).For many reasons (datamodel standards, field number limitations, data management, etc) using one field for each record is better than multiple fields.
The below code writes polygon id's related to each point in a record.The result prints in a string field (in this case "test_1"). You can change this code easily.Just create multiple fields with this code. But if you have many points with many polygon intersect each other, you faced with many fields.
import arcpy,collections
arcpy.env.workspace = "D:/dissolve.gdb"
fc = "myjoin2"
l = []
valueDict1 = collections.defaultdict(list)
tableFields = ["JOIN_FID","TARGET_FID"]
joinFields = ["JOIN_FID","TARGET_FID","test_1"]
with arcpy.da.SearchCursor(fc, tableFields) as searchRows:
for searchRow in searchRows:
KeyValue = searchRow[0]
valueDict1[KeyValue].append(searchRow[1])
l.append(searchRow[0])
valueDict2 = collections.defaultdict(list)
print valueDict1
with arcpy.da.UpdateCursor(fc, joinFields) as curjoin:
for rowjoin in curjoin:
KeyValue2 = rowjoin[0]
if KeyValue2 not in l:
rowjoin[2] = 0
curjoin.updateRow(rowjoin)
for key1 in valueDict1:
if KeyValue2 == key1:
codelinestr = '-'.join(str(b) for b in valueDict1[key1])
rowjoin[2] = codelinestr
# rowjoin[2] = len(valueDict1[key1])
curjoin.updateRow(rowjoin)