PHP birleşmeli diziler bir Array dupes / tür Kaldır

5 Cevap php

Ben ilişkilendirilebilir dizilerin bir dizi var

aa[] = ('Tires'=>100, 'Oil'=>10, 'Spark Plugs'=>4 );
aa[] = ('Tires'=>454, 'Oil'=>43, 'Spark Plugs'=>3 );
aa[] = ('Tires'=>34,  'Oil'=>55, 'Spark Plugs'=>44 );
aa[] = ('Tires'=>454, 'Oil'=>43, 'Spark Plugs'=>45 );
aa[] = ('Tires'=>34,  'Oil'=>55, 'Spark Plugs'=>433 );
aa[] = ('Tires'=>23,  'Oil'=>33, 'Spark Plugs'=>44 );

İki Sorular

  1. How can I remove duplicates according tot he field 'Oil' is there a array_unique which I can provide a callback which acts as a custom comparator?

  2. Nasıl tür özel alanın tarafından 'bujiler' olabilir

5 Cevap

  1. Bunu yapmak için kullanabileceğiniz bir fonksiyon bilmiyorum. Siz dizinin değerleri üzerinden bir foreach yapmak ve elle kontrol teklik yapmak zorunda kalacaktır.

  2. usort() işlevini kullanın ve özel bir karşılaştırıcı sağlar.

Bunun yerine elle gidiyor ve her zamanki yinelenen denetimi yapıyor, ben yaptım



$aa2 = array()

foeach($aa as $key => $value)  {
  $aa2[$value['Oil']] = $value;
}
$aa = $aa2;

Sonra sıralama anahtarı tarafından yapıldı ...

Soru 1 için, ben array_filter ne ihtiyaç olduğunu düşünüyorum.

Brian dediği gibi ve, ikinci soru için usort.

Remove safdilli ile sorun bu şekilde, kısmi teklik bahsediyoruz beri nasıl, değerler kaldığı belirler olduğunu.

Aşağıda bu çözüm sadece endeks sırayla görünmesini ilk tutar. Tam zarif değil, ama işe yarıyor.

<?php

$aa = array();
$aa[] = array('Tires'=>100, 'Oil'=>10, 'Spark Plugs'=>4 );
$aa[] = array('Tires'=>454, 'Oil'=>43, 'Spark Plugs'=>3 );
$aa[] = array('Tires'=>34,  'Oil'=>55, 'Spark Plugs'=>44 );
$aa[] = array('Tires'=>454, 'Oil'=>43, 'Spark Plugs'=>45 );
$aa[] = array('Tires'=>34,  'Oil'=>55, 'Spark Plugs'=>433 );
$aa[] = array('Tires'=>23,  'Oil'=>33, 'Spark Plugs'=>44 );

echo '<pre>';
print_r( arrayUniqeBySubKey( $aa, 'Oil' ) );
echo '</pre>';

function arrayUniqeBySubKey( $array, $key )
{
  $indexAggregates = array();

  foreach ( $array as $idx => $subArray )
  {
    $indexAggregates[$subArray[$key]][] = $idx;
  }

  foreach ( $indexAggregates as $originalIndexes )
  {
    $numOriginals = count( $originalIndexes );
    if ( 1 == $numOriginals )
    {
      continue;
    }
    for ( $i = 1; $i < $numOriginals; $i++ )
    {
      unset( $array[$originalIndexes[$i]] );
    }
  }
  return $array;
}

Siz gerçekten array_filter veri filtreleme için kullanabilirsiniz:

$bb = array_filter($aa, function($item) {
    static $tmp = array();

    if ($filter = !in_array($item['Oil'], $tmp)) {
        $tmp[] = $item['Oil'];
    }

    return $filter;
});

Bu Petrol zaten döndü "hatırlamak" işlevi içinde statik bir değişken kullanır. Bu $tmp yürütülmesi sırasında yalnızca kullanılmalıdır, çünkü işleri array_filter. Örneğin birden çok kez bir fonksiyon içine sarın ve onu ararsanız, $tmp zaman array_filter sağlanan işlevi ilk çağrı için boş bir dizi olacak.

İkinci görev, sıralama, özel bir sıralama işlevi ile usort kullanılarak yapılabilir:

usort($bb, function($a, $b) {
    return ($a['Spark Plugs'] > $b['Spark Plugs']
            ? 1
            : -1);
});