گرفتن زیرمجموعه های شناسه یک آرایه از کل آرایه به صورت تو در تو

۲ سال پیش(به روز شده در ۲ سال پیش) پی اچ پی(PHP)(توابع) ۰

مدتی قبل برای گروه ما در یکی از پروژه ها به تابعی نیاز شد که هر چند جز کدهای ساده ایست اما کارهای بزرگی انجام میدهد. تابع زیر تمامی زیرمجموعه های یک شناسه بصورت تو در تو رو را شناسایی میکند. برای درک بهتر فرض کنید آرایه ای به شکل زیر دارید:

$arr = array(
 1 => null,
 2 => 1,
 3 => 2,
 4 => 3,
 5 => 3);

و میخواهید تمام زیرمجموع های وابسته به مثلا شناسه 1 را پیدا کنید یعنی در آرایه بالا ما به دنبال نتیجه زیر هستیم: 

1 -> 2, 3, 4, 5
2 -> 3, 4, 5
3 -> 4, 5
4 -> 
5 ->

 تابع زیر دقیقا درخواست ما را پاسخ میدهد. این مثال ساده ای بود و مثلا میتوان تمامی زیرمجموعه های یک کاربر تا تو در تو ترین حالت را بدست آورد. یعنی تابع را به مراحل بالاتری بسط داد.

function allSubsets($arr) {
    $result = array();
 
    foreach ($arr as $key => $value) {
        if ($value) {
            $result[$value][] = $key;
            $tmpResult = $result;
            foreach ($tmpResult as $index => $list) {
                if ($index >= $key) {
                    break;
                }
 
                foreach ($list as $i => $j) {
                    if ($value == $j) {
                        $result[$index][] = $key;
                    }
                }
            }
        }
    }
 
    return $result;
}

مثال:

$arr = array(
    1 => null,
    2 => 1,
    3 => 2,
    4 => 3,
    5 => 3);
 
print_r(allSubsets($arr));

نتیجه:

Array
(
    [1] => Array
        (
            [0] => 2
            [1] => 3
            [2] => 4
            [3] => 5
        )

    [2] => Array
        (
            [0] => 3
            [1] => 4
            [2] => 5
        )

    [3] => Array
        (
            [0] => 4
            [1] => 5
        )
)

صفحات پیشنهادی

محاسبه زمان اجرای یک کد(زمان‌سنج) در php...

بسیار پیش می آید تا مدت زمان اجرای یک تکه کد را بدانیم. دو تابع زیر برای حل این مسئله به کمک شما می آیند و مثال مربوطه نیز نحوه استفاده از این دو تابع را کاملا مناسب بیان نموده است. کارکرد توابع آسان ...

توابع رمزگذاری و رمزگشایی یک رشته با خروجی‌های متفاوت...

دو تابع encrypt و decrypt به ترتیب مربوط به رمزگذاری و رمزگشایی می باشند. اما تفاوتی که با حالت معمول دارند این است که خروجی تابع encrypt برای یک مقدار با هر بار فراخوانی متفاوت است. این ویژگی قطعا در...

ایجاد دایرکتوری در صورت نبود آن...

تابع زیر در صورت نبود دایرکتوری آنرا ایجاد می‌نماید. function createDir( $dir ) { if ( !is_dir( $dir ) ) { mkdir( $dir, 0777 ); return true; } return false; }...

تابع محاسبه کننده شروع و پایان یک روز به زمان یونیکس در php...

تابع زیر زمان شروع و پایان یک روز را به فرمت یونیکس بر میگرداند......

نظر

نظری ثبت نشده است.