Sadece belirtilen dizin değerleri oluşur yani dizideki öğeleri ayıklamak

5 Cevap php

Ben bir dizi var

array(
 array('total'=>10,'v'=>3229),
 array('total'=>20,'v'=>3129),
 array('total'=>30,'v'=>3391),
);

PHP aşağıdaki yukarıdaki dönüştürmek için one line yolu var mı?

array(10,20,30);

5 Cevap

Sen array_map kullanabilirsiniz, ancak PHP 5.3 + yoksa o, bir satır biraz daha sürer:

$original = array(
               array('total'=>10,'v'=>3229),
               array('total'=>20,'v'=>3129),
               array('total'=>30,'v'=>3391),
             );


// Callback function
function valueOnly ($element) {
   return $element['total'];
} 

$result = array_map('valueOnly', $original);

PHP 5.3 + ile:

$index = 'total';
$lambda = function ($value) use ($index) { return $value[$index]; };

// Here is the one-liner that can be reused if you save the $lamda-function.
$result = array_map($lambda, $original);

Her iki şekilde de, ben bu okunabilirliği ve yeniden kullanılabilirliğini arttırır beri bu yöntemi öneririm.

Her zaman bir noktalı virgül sona cümleler dil vardır:

foreach ($a as $v){ foreach($v as $k=>$v2) { if($k == 'total') {$r[] = $v2;}}};

Şimdi ben bunu yazmak olmaz.

Bu benim yazmak olabilir, ancak birden fazla satıra özetliyor ki, ilk bir işlevi oluşturmak zorunda (ya da değil, ama bir tek satır :-) bu yazma reddetme)

function get_value($x) {
    return $x['total'];
}

$r = array_map("get_value",$a);

Tek satır tanımlayın. Vinko gösterdiği gibi, tek bir satırda tabloların büyük bir sayı olabilir. Burada (one-liner foreach ifadesi olan) şu anda aklınıza gelebilecek en iyi tek satır çözüm:

$arr1 = array(
   array('total'=>10,'v'=>3229),
   array('total'=>20,'v'=>3129),
   array('total'=>30,'v'=>3391),
);

$arr2 = array();
foreach ($arr1 as $item) $arr2[] = $item['total'];

Açıkçası orada birden fazla çizgi, ama ben zaten $ dizi1 ve başlatılmış $ dizi2 diziler var varsayarak yaşıyorum.

Ben bir amaç için birlikte çalışır (ve bunun varyasyonları) iki gerçekten harika yöntemleri var.

/**
 * Pivots a 2 dimensional array.
 *
 * Turns the column names in a two dimensional array into the rows,
 * using the original array's row indexes as column names.  The input
 * array and its rows may be integer-indexed or a hash.
 *
 * You can optionally specify a column or list of columns to return as rows
 *
 * Example -
 * <pre>
 *
 * input:
 * $aIn => array([0] => array([name] => 'John Doe', [phone] => '555-1000', 'happy'),
 *               [1] => array([name] => 'Fred Doodle', [phone] => '555-2000', 'sad', [title] => 'President'),...
 *
 * output:
 * array([name]  => array([0] => 'John Doe', [1] => 'Fred Doodle',...),
 *       [phone] => array([0] => '555-1000', [1] => '555-2000',...),
 *       [0]     => array([0] => 'happy',    [1] => 'sad',...),
 *       [title] => array([1] => 'President'))
 *
 * </pre>
 * @param  array $aInput    A two dimensional array
 * @param  mixed $mColumns  An array of columns or single column name. If nothing
 *                          passed, then all columns from each input row will become rows
 *                          in the output array.
 * @return array            Pivoted array !!! If a single column name is passed in $mColumns
 *                          The return will be a one-dimensional array; you will get back
 *                          an array of the values for that column.
 */
static function pivot($aIn, $mColumns = null) {

	// Initialize the output
	$aOut = array();
	/*
	 * If input list of column names, then initialize, in case the
	 * input array is empty or doesn't have those columns
	 */
	if (is_array($mColumns) && !empty($mColumns)) {
		foreach ($mColumns as $col) {
			$aOut[$col] = array();
		}
	}
	/*
	 * Output array needs to be passed inside an array to be passed by reference.
	 */
	// TODO As of PHP 5.2.3, could replace callback arg below with simply "xarray::pivot_row", but production uses 5.1.6
	array_walk($aIn, array("xarray", "pivot_row"), array(&$aOut));
	return (empty($aOut) || is_null($mColumns) ? $aOut : (is_array($mColumns) ? array_intersect_key($aOut, array_flip($mColumns)) : $aOut[$mColumns]));
}

public static function pivot_row($aRow, $mKey, $aSpec) {
	foreach ($aRow as $k => $v) {
		$aSpec[0][$k][$mKey] = $v;
	}
}

Nasty çözüm:

$source = array(
 array('total'=>10,'v'=>3229),
 array('total'=>20,'v'=>3129),
 array('total'=>30,'v'=>3391),
);

$totals = array_map( create_function('$a', 'return $a[\'total\'];'), $source );