PHP dizi manipülasyon

2 Cevap php

Ben PHP kullanıyorum. Ben şu mantığı uygulamak gerekir:

Benim $List aşağıdaki veri vardır:

array('id' =>'1','flag'=>'1','place1' =>'val2' ,'place2'=>'val3')
array('id'=> '1','flag'=>'0','place1' =>'val3' ,'place2'=>'val7')
array('id'=> '1','flag'=>'0','place1' =>'val4' ,'place2'=>'val8')
array('id'=> '1','flag'=>'0','place1' =>'val5' ,'place2'=>'val9')
array('id'=> '2','flag'=>'1','place1' =>'val10','place2'=>'val11')
array('id'=> '3','flag'=>'1','place1' =>'val11','place2'=>'val14')

Benim mantık:

 if (flag == 0){

        Store the values of place1 ,Place2 
        in the Index of id

       /*example

        $store[1]= {place1}+{place2}
        hence output:

        store[1]= {val3+val4+val5}+{val7+val8+val9}

similarly
        store[2]= empty
        store[3]= empty
         */

    }
   else{
       Print the Values of place1,place2 of its index

       /*    example

    print place1[1]="val2" ,place2[1]='val3'
    place1[2]="val10",place2[2]='val11'
    place1[3]="val11",place2[3]='val14'      
        */
     }

Benim kısmi pasajı vardır:

foreach ($List as $key => $val)
{
  if($val['flag']!==0){

   //how to implementation

  }
 else{
     echo '$val['place1']'.'$val['place2']';


  }
}

Devam etmek için en iyi yolu nedir?

2 Cevap

Orada veri filtreleme için güzel bir fonksiyon, bir dizi dışında: array___filter. Işlevi, bir geri çağırma işlevi, bir eleman dizide kalmalı mı karar verecek bir işlev gerektirir. Biz create_function kullanarak bir filtre işlevi oluşturmak ve dizinin ilginç parçası ayıklamak.

$reducingFunction = create_function('$value', 'return $value["flag"] == 0;');
$reduced = array_filter($list, $reducingFunction);

Sonraki düzgün bir fonksiyonudur (array_walk) bizim dizi (yani $ değer = $ değer ['param1']) öğelerini dönüştüren biridir, bu yüzden başka bir geri çağırma işlevi oluşturabilirsiniz:

$extractingFunction = create_function('&$value, $key, $index', '$value = $value[$index];');
$valuesParam1 = $reduced;
$valuesParam2 = $reduced;
array_walk($valuesParam1, $extractingFunction, 'param1');
array_walk($valuesParam2, $extractingFunction, 'param1');

Şimdi biz gereken tüm verileri içeren iki diziler var:

$store = array(1 => implode('', $valuesParam1).implode('', $valuesParam2));

Ben dizi $ mağaza başka içermesini istediklerini anlamak için görünmüyor. Veya başka şube ne yapmalıyım, bu yüzden daha fazla açıklama gerektirir.

The code newbie friendly :

$store = array(); // Don't forget to initialize your vars

foreach ($List as $key => $val)
{

  if ($val['flag']==0)
  {
    // we check if $store[$val['id']] contains any value first and set it to zero
    if (isset($store[$val['id']]))
    {
        // we add the previous value with the new one
        $store[$val['id'] = $store[$val['id']] + $val['place1'] + $val['place2'];
    }
    else
    {
       // first time seeing this id, we set the value to 0
       $store[$val['id']] = 0;
    }

  }
  else
  {
     echo '$val['place1']'.'$val['place2']'."\n"; // adding line break (use </ br> if in a web browser)
  }
}

Ben "bayrak" 0 ya da olmamalıdır eğer olsun, bu yüzden onu oynamak vermedi.

Version 2 :

"Bayrak" sadece boolean mantığı için kullanılan, sadece yukarıdaki kodu değiştirebilir ediyorum:

if (!$val['flag'])

Sonra Özetle PHP kısayollarını da kullanabilirsiniz:

$store[$val['id'] += $val['place1'] + $val['place2'];

Bilezik bir satır işlemleri için gerekli değildir:

if (isset($store[$val['id']]))
    $store[$val['id'] = $store[$val['id']] + $val['place1'] + $val['place2'];
else
   $store[$val['id']] = 0;

Ve ya "$ anahtar" var gerekmez.

Yani kod olur:

$store = array(); 

foreach ($List as $val)

  if (!$val['flag'])
    if (isset($store[$val['id']]))
        $store[$val['id'] += $val['place1'] + $val['place2'];
    else
       $store[$val['id']] = 0;

  else
     echo '$val['place1']'.'$val['place2']'."\n";

Version 3 :

if / else / set işlemleri (daha az okunabilir ve daha yavaş sakının) üçlü operatörü kullanarak kısaltabilir edilebilir:

$store[$val['id'] = isset($store[$val['id']]) ? 0 : $store[$val['id']] + $val['place1'] + $val['place2'];

Yani kod olur:

$store = array(); 

foreach ($List as $val)
  if (!$val['flag'])
    $store[$val['id'] = isset($store[$val['id']]) ? 0 : $store[$val['id']] + $val['place1'] + $val['place2'];
  else
     echo '$val['place1']'.'$val['place2']'."\n";

Pro version

Eğer bu bir kez olsun, soulmerge kodunu kontrol edin. O bunu daha küçük olabilir çünkü zaman fonksiyonel programlama kullanmak gerçekten akıllı ve sonuç her başkalarına taşınıyor olabilir, bu nedenle kod daha tekrar kullanılabilir. Dahası, kullanan jeneratörler genellikle daha az bellek tüketiyor.