Nasıl iki dizileri ve PHP liste farklılıklar karşılaştırabilirsiniz?

5 Cevap php

Ben aşağıdakileri yapmak için bir form inşa ediyorum:

  • MySQL çekerek, kullanıcılar ve izinler bir tablo yazdırın. Bir kullanıcının sahip olduğu her izin bir kontrol kutusu ve onlar eksikliği her biri bir denetlenmeyen kutudur.
  • Izinleri vermek veya çıkarmak için onay kutularını ve işaretini kaldırın bir yönetici izin verin.
  • Form gönderildiğinde, izinlerini belirli değişiklikleri vurgulayarak, değişmiş olacak SADECE kullanıcıları ile onay sayfasını gösteriyor.
  • Değişiklikleri teyit edildiği zaman, buna göre veritabanı değiştirebilirsiniz.

Bunu yapmak için, ben kullanıcı izinleri iki dizileri oluşturma: ne veritabanı gösterileri göre birini, ve ne formu gösterir göre birini.

Bir kullanıcı MySQL bir izni yoksa, bir 0 olarak gösterilir. Onlar form gönderme iznini eksikliği varsa, bu sadece mevcut olmayacaktır.

İşte dizilerin iki basit örnek:

Database array

[User1] => Array ([public] => 1
                [private] => 1
                [secret] => 1
               ) 
[User2] => Array ([public] => 1
                [private] => 0
                [secret] => 0
               )

Form submission array (revoking "secret" from User1 and giving it to User2)

[User1] => Array ([public] => 1
                [private] => 1 
               )

[User2] => Array ([public] => 1
                  [secret] => 1
                 )

Question

: Nasıl elegantly combine these two arrays, bir "değişiklik" dizisi, öyle ki yapmak yapabilirsiniz

  • Hem de aynı izinlere sahip kullanıcılar atlandı
  • Kamu, özel ve gizli - - 0 veya 1 olarak ayarlandığında kalan kullanıcıların tüm izinlere sahip.
  • Bu form gönderme dizide olsaydı form gönderme dizi ve 1 eksik ise her izin 0'dır

Örneğin, yukarıda birleştirerek vermek istiyorum:

[User1] => Array ([public] => 1
                [private] => 1
                [secret] => 0
               ) 
[User2] => Array ([public] => 1
                [private] => 0
                [secret] => 1
               )

Attempts so far

  • İlk adım olarak, ben onlar farklıydı veritabanı dizi üzerine yazmak düşünerek, ikinci listelenen formlar dizisi ile () array_merge kullanarak denedim. Bunun yerine, farklı unsurları silindi.
  • Ben iki diziyi karşılaştırmak için bir foreach () deyimi kurma denedim, ancak bu karmaşık oluyor, ve ben basit bir yolu var olmalıdır düşünüyorum

UPDATE

Yaşasın! Yeni bir cevap Bu eski soruya dikkat çekti. Ben bu çalışma var, ama daha sonra bu çılgın kodu hurdaya - bu yol çok geri gitmek ve çalışmak için karışıktı. Bunun yerine, ben üzerinden değişiklikleri göndermek için bir AJAX ön uç yazdı, sonra bir anda bir izni değiştirmek için bir PHP arka uç bir senaryo yazdı. Çok basit kod ve değişiklikler kullanıcı için anlık vardır. Bir vurgulamak etkisi, ne değişti yaklaşık on-sayfa geri bildirim anında verir.

5 Cevap

Eğer PHP: Arrays manual bakarak ne gerek bulabilirsiniz. Sen oldukça iyi belgelenmiş soruyu ettik ama ben hala açıkça size gereken budur bunu yapamazsınız.

Özellikle iki Dizilerin farkı veya kesişimi hesaplamak için, array_diff () ve array_intersect () kullanılarak bakıyor olmalıdır.

Sonrası veriler yalnızca vermelisiniz izinleri içerir. Yani, 0'a set tüm izinlere sahip bir "temel" kurmak. Ardından sunulması ile birleştirmek.

$empty_perms = array("public" => 0, "private" => 0, "secret" => 0);

$new_user1_perms = array_merge($empty_perms, $_POST['User1']);
$new_user2_perms = array_merge($empty_perms, $_POST['User2']);

Şimdi Birleştirilmiş dizileri kullanarak veritabanını güncellemek. Bu şekilde tüm elemanları için doğru izinleri koyacaktır.

Let's try to combine gnud's solution with comparing by value. I've added one more key "member" to show zero permission being unchanged.

// empty permissions
$empty_perms = array("public" => 0, "private" => 0, "secret" => 0, "member" => 0);

// original permissions (please note that it MUST contain ALL keys)
$old_perms = array("public" => 1, "private" => 0, "secret" => 1, "member" => 0);

// POST data container
$post_data = array("public" => 1, "private" => 1);

// apply new user permissions - put them into db
$new_perms = array_merge($empty_perms, $post_data);

// differences to show
$diff_perms = array();

// compare new and old permissions
foreach($empty_perms as $k => $v) {
    $diff_perms[$k] = (int)($old_perms[$k] !== $new_perms[$k]);
}

Bu örnek size aşağıdaki sonuçları (eski, yeni, değişiklikler) vermelidir:

Array
(
    [public] => 1
    [private] => 0
    [secret] => 1
    [member] => 0
)

Array
(
    [public] => 1
    [private] => 1
    [secret] => 0
    [member] => 0
)

Array
(
    [public] => 0
    [private] => 1
    [secret] => 1
    [member] => 0
)

Umarım bu yardımcı olur.

Üzerine varyasyon çeşit differential execution yardımcı olacağını merak ediyorum.

Kullanmak için array_diff() ilk argüman süperset olmalı, ya da iki dizilerin büyük. Sadece büyük olan dizi emin olmadığınız zaman array_diff() kullanmak için:

  //start with the superset of for array_diff to return differences
  if(count($prev_wholesaler_assignments) > count($wholesalers)){
      $perm_diff = array_diff($prev_wholesaler_assignments,$wholesalers);  
  } elseif (count($prev_wholesaler_assignments) < count($wholesalers)){
      $perm_diff = array_diff($wholesalers,$prev_wholesaler_assignments);
  }

Bu ne olursa olsun dizi büyük olur hangi disjunction döndürür.