2D Array Keys kaldırmak için kolay yolu?

2 Cevap php


I have an Array that looks like this:

array(
  0 => array(
    'key1' => 'a',
    'key2' => 'b',
    'key3' => 'c'
  ),
  1 => array(
    'key1' => 'c',
    'key2' => 'b',
    'key3' => 'a'
  ),
  ...
)

Ben tuşları sadece bir (değişken) numarasını, yani reduce_array (array ('anahtarı1', 'key3')) içeren bir dizi almak için bir işlev gerekir; dönmelidir:

array(
  0 => array(
    'key1' => 'a',
    'key3' => 'c'
  ),
  1 => array(
    'key1' => 'c',
    'key3' => 'a'
  ),
  ...
)

Bunu yapmanın en kolay yolu nedir? Mümkünse benim arkadaşları gibi array_filter veya array_map gibi herhangi bir ek yardımcı fonksiyonu olmadan zaten çok fonksiyonlarını kullanarak benim hakkımda şikayetçi.

O varlığı için kontrol etmek için gerekli değil bu yüzden kaynak dizi her zaman verilen anahtarları olacaktır.

Bonus puan değerleri (tuşları her zaman anahtarı1 değeri varsa bir sonra diğer anahtar (lar) her zaman değer b olacaktır anlamı, birbirleriyle ilişkili olacak) benzersiz olup olmadığını.

Ama işler benim şimdiki çözüm (hatta isim korkunç ama daha iyi bir bulamıyorum) oldukça sakar:

function get_unique_values_from_array_by_keys(array $array, array $keys)
{
        $result = array();
        $found = array();

        if (count($keys) > 0)
        {
                foreach ($array as $item)
                {
                        if (in_array($item[$keys[0]], $found)) continue;
                        array_push($found, $item[$keys[0]]);
                        $result_item = array();
                        foreach ($keys as $key)
                        {
                                $result_item[$key] = $item[$key];
                        }
                        array_push($result, $result_item);
                }
        }
        return $result;
}

Addition:
PHP Version is 5.1.6.

2 Cevap

Lütfen arkadaşları array_filter gibi ya array_map istemiyorsanız, bu eğitim ve tat onların eksikliğidir. Ben işte köprüleri yakma tavsiye yok ederken, sık sık bir sorunu çözmek için en iyi yoldur.

function reduce_array($array, $keys) {
  $keys_map = array_fill_keys($keys, true);
  return array_map(function ($subarray) use ($keys) {
    return array_intersect_key($subarray, $keys_map);
  }, $array);
}

(Not: Yukarıda kullanmak anonim fonksiyonlar PHP> = 5.3 sadece mevcuttur, bu nedenle muhtemelen bunları kullanamazsınız)

Eğer array_map ve anonim fonksiyonlar olmadan bunu yapmak gerekir:

function reduce_array($array, $keys) {
  $ret = array();
  $keys_map = array_fill_keys($keys, true);
  foreach ($array as $subarray) {
    array_push($ret, array_intersect_key($subarray, $keys_map));
  }
  return $ret;
}

Kısaca açıklamak gerekirse: Birincisi, ben array_fill_keys (bir dize endeksli dizi ben vermek değerini bir tamsayı-Dizinlenmiş diziden anahtarları, true, etmez gerçekten önemli çevirmek için kullanabileceğiniz burada). Bu aradığınız tam azaltma yapacak olan, bu uygun bir giriş array_intersect_key için yapar.

Sadece () fonksiyonunu kullanarak in_array. Karakter sayısı azaltılmış olabilir ama biz okunabilir bırakacağım:

function reduce_array($array, $keys) {
    $res=array(); // Our result array
    foreach($array as $v1){ // Loop thru original array
        $t1=array(); // Our new inner array
        foreach($v1 as $k2=>$v2){ // Loop thru original inner array
            if(in_array($k2,$keys)) $t1[$k2]=$v2; //If inside inner array store
        }
        $res[]=$t1; //Add to result array
    }
    return($res);
}

Ben de İn_Array'in () fonksiyonu kurtulmak kaşıntı değilim ama gerçekten bazı işler yapmanız gerekir ;)