2013-04-25 2 views
4

В php есть способ получить элемент из каждого вспомогательного массива без необходимости циклического мышления с точки зрения эффективности.PHP - получить конкретный элемент формы для каждого вспомогательного массива без цикла

Say следующий массив:

$array = array(
    array(
     'element1' => a, 
     'element2' => b 
    ), 
    array(
     'element1' => c, 
     'element2' => d 
    ) 
); 

Я хотел бы все значения по 'element1' из массива $

+0

Looping будет намного более эффективным, чем любые альтернативы, если вы точно не знаете, сколько записей находится на верхнем уровне вашего массива, и вы хотите жестко закодировать строку кода для каждого элемента. так что 200 записей = 200 строк кода, без возможности изменить количество записей без изменения кода и сэкономить вам все 2.75 пикосекунды, чтобы избежать циклирования - плохо на целой загрузке счетчиков, хорошо ни на одном –

+1

200 строк кода даже приклеивание займет более 2,75 пикосекунды. Если для этого не существует определенной логики, о которой не было сказано в этом вопросе, нет смысла в том, чтобы не зацикливать. –

+0

Как вы хотите, чтобы элемент element1 вернулся к вам? Массив? Строка? –

ответ

2

Вы можете использовать array_map.

код Try ниже ...

$arr = $array = array(
    array(
     'element1' => a, 
     'element2' => b 
    ), 
    array(
     'element1' => c, 
     'element2' => d 
    ) 
); 

print_r(array_map("getFunc", $arr)); 

function getFunc($a) 
{ 
    return $a['element1']; 
} 

См Codepad.

Но я думаю, что array_map также будет использовать цикл внутри.

+0

Я предпочитаю это обозначение: '$ func = function() {echo $ a ['element1']." \ n ";} array_map ($ func, $ arr);' (работает с PHP 5.3). – str

+1

Почему обратные вызовы array_map? array_map должны возвращать значение, а array_map сам будет возвращать массив. Ваш пример здесь будет лучше с array_walk –

2

Если вы используете PHP 5.5 (в настоящее время бета-4 доступен), то следующий

$element1List = array_column($array, 'element1'); 

должен дать $ element1List как простой массив значений только element1 для каждого элемента $ массив

$array = array(
    array(
     'element1' => a, 
     'element2' => b 
    ), 
    array(
     'element1' => c, 
     'element2' => d 
    ) 
); 

$element1List = array_column($array, 'element1'); 
print_r($element1List); 

дает

Array 
(
    [0] => a 
    [1] => c 
) 
4

Есть целый ряд различных развлечений ctions, которые могут работать с массивами для вас, в зависимости от выхода желаемого ...

$array = array(
    array(
     'element1' => 'a', 
     'element2' => 'b' 
    ), 
    array(
     'element1' => 'c', 
     'element2' => 'd' 
    ) 
); 

// array of element1s : array('a', 'c') 
$element1a = array_map(function($item) { return $item['element1']; }, $array); 

// string of element1s : 'ac' 
$element1s = array_reduce($array, function($value, $item) { return $value . $item['element1']; }, ''); 

// echo element1s : echo 'ac' 
array_walk($array, function($item) { 
    echo $item['element1']; 
}); 

// alter array : $array becomes array('a', 'c') 
array_walk($array, function(&$item) { 
    $item = $item['element1']; 
}); 

Полезные ссылки Документация:

+0

Почему, черт возьми, 'map' и' walk' принимают свои аргументы в противоположном? C'mon PHP, сделайте что-то здравомыслящее. – Eric

0

Без цикл? Рекурсия!

$array = array(
     array(
       'element1' => 'a', 
       'element2' => 'b' 
     ), 
     array(
       'element1' => 'c', 
       'element2' => 'd' 
     ) 
); 

function getKey($array,$key,$new = array()){ 
    $count = count($array); 
    $new[] = $array[0][$key]; 
    array_shift($array); 

    if($count==1) 
     return $new; 

    return getKey($array,$key,$new); 
} 

print_R(getKey($array,'element1')); 

Как я понял из Википедии Recursion не цикл.

Смежные вопросы