قيم صفيف تصفية php وإزالة التكرارات من صفيف متعدد الأبعاد

StackOverflow https://stackoverflow.com//questions/22001121

سؤال

مرحبًا جميعًا، أحاول العثور على قيم x مكررة من هذه المصفوفة وإزالتها وترك القيم الفريدة فقط.على سبيل المثال مجموعتي هي

Array
(
[0] => Array
    (
        [x] => 0.5
        [y] => 23
    )

[1] => Array
    (
        [x] => 23
        [y] => 21.75
    )

[2] => Array
    (
        [x] => 14.25
        [y] => 21.875
    )

[3] => Array
    (
        [x] => 19.375
        [y] => 21.75
    )

[4] => Array
    (
        [x] => 9.125
        [y] => 21.875
    )

[5] => Array
    (
        [x] => 23
        [y] => 19.625
    )

[6] => Array
    (
        [x] => 19.375
        [y] => 19.625
    ) 
)

إذن ما أحتاج إلى حدوثه هو إجراء حلقات عبر الأمر بأكمله ورؤية قيمة x الأولى على أنها .5 ثم المتابعة وأي شيء آخر له x على أنه .5 قم بإزالته من المصفوفة بحيث يكون لدي في النهاية مصفوفة تبدو هكذا

 Array
   (
[0] => Array
    (
        [x] => 0.5
        [y] => 23
    )

[1] => Array
    (
        [x] => 23
        [y] => 21.75
    )

[2] => Array
    (
        [x] => 14.25
        [y] => 21.875
    )

[3] => Array
    (
        [x] => 19.375
        [y] => 21.75
    )

[4] => Array
    (
        [x] => 9.125
        [y] => 21.875
    )
)

حيث تكون جميع قيم X فريدة من نوعها.لقد بحثت عبر الإنترنت ووجدت هذه الوظيفة التي يجب استخدامها ولكن يبدو أن هذا لا يعمل:

 $result = array_map("unserialize", array_unique(array_map("serialize", $array)));    
هل كانت مفيدة؟

المحلول

ما عليك سوى التكرار والعثور على قيم فريدة أثناء التنقل:

$taken = array();

foreach($items as $key => $item) {
    if(!in_array($item['x'], $taken)) {
        $taken[] = $item['x'];
    } else {
        unset($items[$key]);
    }
}

كل مرة الأولى x يتم استخدام القيمة، ونحن نحفظها - ويتم حفظها في الاستخدامات اللاحقة unset من المصفوفة.

نصائح أخرى

array_unique يقارن قيم السلسلة، حتى تتمكن من إنشاء كائنات (مع تحميل زائد __toString وظيفة) كخطوة وسيطة.

class XKeyObj {
    public $x;
    public $y;

    public function XKeyObj($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }

    public function __toString() { return strval($this->x); }
}

function array_to_xKey($arr) { return new XKeyObj($arr['x'], $arr['y']); }
function xKey_to_array($obj) { return array('x' => $obj->x, 'y' => $obj->y); }

$input = array(
    array('x' => 0.5, 'y' => 23),
    array('x' => 23, 'y' => 21.75),
    array('x' => 14.25, 'y' => 21.875),
    array('x' => 19.375, 'y' => 21.75),
    array('x' => 9.125, 'y' => 21.875),
    array('x' => 23, 'y' => 19.625),
    array('x' => 19.375, 'y' => 19.625)
);

$output = array_map('xKey_to_array',
                    array_unique(array_map('array_to_xKey', $input)));

print_r($output);

النتائج:

Array
(
    [0] => Array
        (
            [x] => 0.5
            [y] => 23
        )

    [1] => Array
        (
            [x] => 23
            [y] => 21.75
        )

    [2] => Array
        (
            [x] => 14.25
            [y] => 21.875
        )

    [3] => Array
        (
            [x] => 19.375
            [y] => 21.75
        )

    [4] => Array
        (
            [x] => 9.125
            [y] => 21.875
        )

)

عند إجراء اختبارات متكررة على المصفوفات، يتم سحب الأداء باستخدام in_array() سوف تتفاقم تدريجياً مع زيادة حجم مجموعة البحث المؤقتة الخاصة بك.

مع وضع ذلك في الاعتبار، استخدم المفاتيح الترابطية المؤقتة لتحديد التكرارات اللاحقة !isset() يمكن استدعاؤها على متغير النتيجة المتنامي الخاص بك.نظرًا لأن مصفوفات php عبارة عن خرائط تجزئة، فإن هذه التقنية سوف تتفوق باستمرار in_array().

هناك مشكلة تتعلق بهذه المفاتيح المؤقتة والتي تنطبق بشكل خاص على قيم النوع العائم. عند استخدام العوامات كمفاتيح مصفوفة، سيقوم PHP بتحويلها إلى أعداد صحيحة عن طريق الاقتطاع ("الأرضية" وليس "التقريب").لتجنب هذا التأثير الجانبي غير المرغوب فيه، قم بإضافة حرف غير رقمي (بخلاف الواصلة بالطبع) إلى المفاتيح المؤقتة بحيث يصبح العائم عبارة عن سلسلة.

شفرة:(تجريبي)

$array = [
    ['x' => 0.5, 'y' => 23],
    ['x' => 23, 'y' => 21.75],
    ['x' => 14.25, 'y' => 21.875],
    ['x' => 19.375, 'y' => 21.75],
    ['x' => 9.125, 'y' => 21.875], 
    ['x' => 23, 'y' => 19.625],
    ['x' => 19.375, 'y' => 19.625],
];

foreach ($array as $row) {
    if (!isset($result['#' . $row['y']])) {
        $result['#' . $row['y']] = $row;
    }
}
var_export(array_values($result));

انتاج:

array (
  0 => 
  array (
    'x' => 0.5,
    'y' => 23,
  ),
  1 => 
  array (
    'x' => 23,
    'y' => 21.75,
  ),
  2 => 
  array (
    'x' => 14.25,
    'y' => 21.875,
  ),
  3 => 
  array (
    'x' => 23,
    'y' => 19.625,
  ),
)

ملاحظة.في حالة التعامل مع قيم سلسلة أو أعداد صحيحة كمفاتيح مؤقتة، ليست هناك حاجة لإضافة أي أحرف مسبقًا.إذا كنت لا تهتم بإزالة المفاتيح المؤقتة من النتيجة (لأنك تصل فقط إلى قيم المصفوفة الفرعية "البرنامج النصي السفلي"، فلن تحتاج إلى الاتصال array_values() بعد التكرار.

giveacodicetagpre.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top