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

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

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

تابع محاسبه طول رشته با یونیکد utf-8...

دو تابع جهت بررسی طول یک رشته utf8. function strlen_utf8( $str ) { return mb_strlen( $str, 'UTF-8' ); }   //or... function strlen_utf8( $str ) { $c = 0; $len = strlen( $str ); ...

گرفتن محتوای وب سایت با کمک curl در php...

در پستهای قبل چنین مطلبی ذکر شده بود اما اینبار از قدرت سری توابع curl برای این منظور استفاده نمودیم. مزیت استفاده از این روش معرفی User agent و سایر موارد اضافی است که بصورت معمول نمیتوان با استفاده ...

گرفتن مقادیر آرایه با کلید خاص(تابع array column)...

تابع array_column مقادیر یک آرایه را با توجه به مقدار یک کلید خاص بر می گرداند....

دسترسی به مقادیر آرایه بصورت کلیدهای غیر عددی با شماره کلید(گسترش تابع array slice)...

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

نظر

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