[ERC1155] Should I use built-in safe functions in a loop for my customized contract?

Hi everyone,
So, I was trying to build my own ERC1155 contract. I want to add some customized features to my own contract. One of them is a function that help me transfer multiple tokens from multiple addresses to one receiver.

My initial idea was something like this:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";

contract myContract is ERC1155 {

    constructor() ERC1155("sampleURI") {
        // Do something here.


    function myBatchFunction(
        address[] memory froms,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public {
        // Do something here to check the length mismatch problem.
        // ...

        // Using built-in function in a loop.
        for (uint256 i = 0; i < froms.length; ++i) {
            address from = froms[i];
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            safeTransferFrom(from, to, id, amount, data);

I did try to deploy this contract in Remix, test the function and everything seems pretty fine :100: :100: :100:

However, my main purpose when I create such myBatchFunction is avoiding multiple transactions (and save transaction cost, time consuming). I am not sure if it would be okay if I put Openzeppelin's built-in safe functions in a loop. As I guess that there's some meaning behind its name as the word "safe".

I did have a glance at Openzeppelin ERC1155 contract and surprisingly discover that the safeBatchTransferFrom() function just doesnt reuse the safeTransferFrom() function in its loop. Is there any special reason for this?

This is the safeBatchTransferFrom() function with "redundant code"?

Also, I'm curious about the reason why Openzeppelin's ERC1155 contract doesnt contain some functions for transfering from multiple addresses to one address or transfering from multiple address to multiple addresses? Are there kind of some special reasons for this? Or am I just misunderstanding the concept here?