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

۱ سال پیش(به روز شده در ۱ سال پیش) پی اچ پی(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
        )
)

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

نمایش آرایه به صورت درخت...

تابع print_r برای نمایش متغیر مخصوصا آرایه ها بسیار پر کاربرد است و قطعا برنامه نویسان php بارها با آن برخورد داشته اند. در این مطلب تابعی معرفی می گردد که آرایه ها را بر خلاف تابع print_r بصورت درخت ...

بررسی صحت ایمیل از نظر ساختار...

با توجه به کد زیر اگر ایمیل از لحاظ ساختار صحیح باشد مقدار True و در غیر این صورت مقدار False را بر می گرداند. به ساختار خوب توجه کنید! function valid_email($email) { return preg_match('/^([a-z...

جدا سازی سه رقمی اعداد جهت خوانایی بهتر با تابع numberformat...

در php تابعی با نام number_format جهت جدا سازی سه رقمی اعداد وجود دارد ، اما با این وجود برای آموزش و جلوگیری از خطا بدلیل پشتیبانی نشدن در نسخه های مختلف php این تابع را معرفی می کنیم که به شرح زیر ا...

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

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

نظر

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