Dizi, Keys aracılığıyla sıralamak gerekir

2 Cevap php

Tamam, bu nasıl gerçekten emin değil. Ben şöyle bir SQL sorgusu duyulur ediliyor değerlere sahiptir:

$row[0] = array('lid' => 1, 'llayout' => 1, 'lposition' => 1, 'mid' => 1, 'mlayout' => 1, 'mposition' => 0);
$row[1] = array('lid' => 2, 'llayout' => 1, 'lposition' => 0, 'mid' => 2, 'mlayout' => 1, 'mposition' => 0);
$row[2] = array('lid' => 2, 'llayout' => 1, 'lposition' => 0, 'mid' => 3, 'mlayout' => 1, 'mposition' => 1);
$row[3] = array('lid' => 3, 'llayout' => 1, 'lposition' => 1, 'mid' => 4, 'mlayout' => 1, 'mposition' => 1);
$row[4] = array('lid' => 4, 'llayout' => 1, 'lposition' => 2, 'mid' => 5, 'mlayout' => 1, 'mposition' => 0);   

vs vs

Tamam, bunun için aklınıza gelebilecek en iyi şey kapağı ve orta dizi anahtarları vermek ve bunu gibi sorgu sırasında döngü içinde bir diziye kompozisyon, eşit var yani ...

$old[$row['lid']][$row['mid']] = $mposition;

Bunu Şimdi, eğer ben bir $ _POST dizi [] dayanarak inşa etmek gerekir başka bir dizi ile bu dizinin anahtarları karşılaştırmak gerekir.

$new = array();
foreach($_POST as $id => $data)
{
   // $id = column, but we still need to get each rows position...
   $id = str_replace('col_', '', $id);
   // now get the inner array...
   foreach($data as $pos => $idpos)
       $new[$id][$idpos] = $pos;
}

Tamam, şimdi ben ($ eski) veritabanından bilgi, 1 2 diziler var, ve $ _POST pozisyonlara (yeni $) başka, ben dizi anahtarları doğru var umuyoruz.

Şimdi yeni, eski gelen karşılaştırarak, bir değişti anlamaya ihtiyacımız var. Ve aynı zamanda, yeni pozisyonların tüm veritabanını güncellemek için gereken yere yeni kapak = eski kapak, ve yeni orta = her diziden eski orta. Ben array_key kullanabilir ya da bir şekilde array_key_intersect gerekecek eminim, ama emin değilim tam olarak nasıl ...??

Ayrıca, ben bir UPDATE, bir foreach döngüsü içinde yararlı olacağını sanmıyorum, belki UPDATE sorgusu bir CASE deyimi yapmak için bir yolu var mı?

Ayrıca, bu konuda doğru bir yol gidiyor muyum? YA ben bunu yerine bu bir muli-boyutlu bir dizi kullanarak başka bir şekilde yapmak gerekir.

Temelde aynı tuşlar = içinde her dizi değeri değişti veritabanında güncelleştirmek gerekir ve bunu güncelleştirmek için gereken yere veritabanında orta = orta (ikinci anahtar değeri).

Ayrıca, ben bu tür böyle olacağını düşünüyorum:

$newest = array();

        foreach($old as $c => $d)
        {
            foreach($d as $e => $f)
                $newest[$c][$e] = $new[$c][$e];
        }

Ancak 1 veya 2 php dizi fonksiyonları ile bunu yapmak için daha iyi bir yolu yok mu? Ve ben de hala arggg .... hangi değerlerin değiştiğini bilmek gerekir

2 Cevap

Tamam, senin tüm yardım için teşekkürler çocuklar, gerçekten takdir! O array_diff_assoc daha bu şekilde daha hızlı yapar gibi, daha iyi bir yolunu buldu bile. Bu buldum fonksiyonu, hem diziler yaptıktan sonra, ben sadece $ updatedArray = array_diff_no_cast ($ yeni, $ eski) kullanın;

function array_diff_no_cast(&$ar1, &$ar2) {
   $diff = Array();
   foreach ($ar1 as $key => $val1) {
      if (array_search($val1, $ar2) === false) {
         $diff[$key] = $val1;
      }
   }
   return $diff;
}

Cheers :)

Benim son denemeydi tamamen yararsızdır beri ben, tüm bu cevabı düzenleme ediyorum.

Ben bunu fark:


foreach($old as $c => $d)
  {
    foreach($d as $e => $f)
      $newest[$c][$e] = $new[$c][$e];
  }

Ve ben senin değişken isimleri daha fazla düşünce vererek önermek zorunda hissediyorum. Son derece açıklayıcı değişken adları kendi kodunuzu anlamak için yardımcı olur ve diğer insanların kodunuzu anlamak için özellikle yardımcı olur.

Şimdi, tekrar soru çözmek için çalışın ...

I () çok array_diff_assoc kullanmak istemiyorum, ama bu gibi kullanmak inanıyorum:

$temp_changed=array();
foreach($new as $id => $mid){
    $temp_changed = array_diff_assoc($mid, $old[$id]);
    if(count($temp_changed)){
        $changed[$id] = $temp_changed;
    }
    unset($temp_changed);
}

Array_diff_assoc kontrol tuşları ve değerleri, yukarıdaki örnekte $ yeni [$ id] tüm anahtar / değer çiftleri bir dizi döndürür $ eski [$ id] değildir

Yani $ yeni $ eski gibi aynı yapıya sahiptir $ değişti dizi ile sona erecek

Sonra sadece yapabilirsiniz:

foreach($changed as $id=>$mid){
  // Do UPDATE
}

Daha iyi bir yolu olup olmadığını iç içe foreach ifadeleri ile çok boyutlu diziler aracılığıyla döngü yolu olarak, ben bu konuda bilmiyorum.