سالیدیفا

آرایه (Array)

آرایه (Array) می تواند یک اندازه ثابت در زمان کامپایل و یا اندازه پویا داشته باشد.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Array {
    // روش های مختلف تعریف و مقدار دهی آرایه
    uint[] public arr;
    uint[] public arr2 = [1, 2, 3];
    // آرایه با اندازه ثابت. تمام عناصر مقدار صفر دارند
    uint[10] public myFixedSizeArr;

    function get(uint i) public view returns (uint) {
        return arr[i];
    }

    // سالیدیتی میتواند کل آرایه را برگرداند
    // اما از این تابع نباید استفاده کرد
    // چرا که طول آرایه میتواند نامحدود باشد
    function getArr() public view returns (uint[] memory) {
        return arr;
    }

    function push(uint i) public {
        // اضافه کردن به آرایه
        // یک واحد به آرایه اضافه می شود
        arr.push(i);
    }

    function pop() public {
        // آخرین عنصر از آرایه حذف می شود
        // و طول آرایه یک عدد کم می شود
        arr.pop();
    }

    function getLength() public view returns (uint) {
        return arr.length;
    }

    function remove(uint index) public {
        // اندازه آرایه را تغییر نمیدهد Delete
        // مقدار عنصر مورد نظر را به عدد پیش فرض بر میگرداند
        // که در اینجا صفر است
        delete arr[index];
    }

    function examples() external {
        // ساخت آرایه در حافظه، فقط با اندازه ثابت می تواند ساخته شود
        uint[] memory a = new uint[](5);
    }
}
Solidity

مثالی از حذف عنصر آرایه #

حذف عنصر آرایه با جابجایی عناصر از راست به چپ

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract ArrayRemoveByShifting {
    // [1, 2, 3] -- remove(1) --> [1, 3, 3] --> [1, 3]
    // [1, 2, 3, 4, 5, 6] -- remove(2) --> [1, 2, 4, 5, 6, 6] --> [1, 2, 4, 5, 6]
    // [1, 2, 3, 4, 5, 6] -- remove(0) --> [2, 3, 4, 5, 6, 6] --> [2, 3, 4, 5, 6]
    // [1] -- remove(0) --> [1] --> []

    uint[] public arr;

    function remove(uint _index) public {
        require(_index < arr.length, "index out of bound");

        for (uint i = _index; i < arr.length - 1; i++) {
            arr[i] = arr[i + 1];
        }
        arr.pop();
    }

    function test() external {
        arr = [1, 2, 3, 4, 5];
        remove(2);
        // [1, 2, 4, 5]
        assert(arr[0] == 1);
        assert(arr[1] == 2);
        assert(arr[2] == 4);
        assert(arr[3] == 5);
        assert(arr.length == 4);

        arr = [1];
        remove(0);
        // []
        assert(arr.length == 0);
    }
}
Solidity

حذف عنصر آرایه با کپی کردن آخرین عنصر در محلی برای حذف

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract ArrayReplaceFromEnd {
    uint[] public arr;

    // حذف یک عنصر باعث ایجاد خلا در آرایه می شود.
    // یک روش برای حفظ فشردگی آرایه
    // آخرین عنصر را به محل حذف منتقل کنید.
    function remove(uint index) public {
        // انتقال آخرین عنصر به محل حذف
        arr[index] = arr[arr.length - 1];
        // حدف آخرین عنصر
        arr.pop();
    }

    function test() public {
        arr = [1, 2, 3, 4];

        remove(1);
        // [1, 4, 3]
        assert(arr.length == 3);
        assert(arr[0] == 1);
        assert(arr[1] == 4);
        assert(arr[2] == 3);

        remove(2);
        // [1, 4]
        assert(arr.length == 2);
        assert(arr[0] == 1);
        assert(arr[1] == 4);
    }
}
Solidity

نمایش در Remix #

احساست در مورد این مقاله چیه؟