2015-03-10 2 views
1

Может кто-нибудь узнать, есть ли еще более эффективный способ или единственная функция, которая позволит достичь ниже, без необходимости в цикле foreach? Я понимаю, что это будет практически без проблем производительности ниже, но я всегда ищу новые и, надеюсь, более эффективные способы кодирования.PHP манипулирует массивами без foreach

(Пуш первое значение элемента с ключом, самокаты второе значение элемента на новое значение ключа, убрать старые данные)

Входные

Array 
(
    [0] => Array 
     (
      [supplier_id] => 1 
      [supplier_company] => Company Alpha 
     ) 

    [1] => Array 
     (
      [supplier_id] => 2 
      [supplier_company] => Company Beta 
     ) 

) 

Функция

foreach ($suppliers as $key => $value) { 
     $new_array[$value['supplier_id']] = $value['supplier_company']; 
} 

Выходные

Array 
(
    [1] => Company Alpha 
    [2] => Company Beta 
) 
+2

, так как вы не используете 'значение $ key' вы можете устранить' $ ключ => 'часть вашего цикла – cmorrissey

+1

Кроме того, используйте' Еогеасп ($ поставщиков, как и $ значение) 'вместо этого. Как сказано в другом комментарии, это ускорит ваш код, потому что вы будете получать доступ к указателю вместо создания копии данных. После этого вы можете безопасно использовать 'unset ($ supplier)'. –

ответ

2

array_column будет делать трюк:

$inp = array(
    array(
     'supplier_id' => 1, 
     'supplier_company' => 'Company Alpha' 
    ),array(
     'supplier_id' => 2 
     'supplier_company' => 'Company Beta' 
    ) 
); 

$out = array_column($inp,'supplier_company','supplier_id'); 

var_dump($out); 
/* 
Array 
(
    [1] => Company Alpha 
    [2] => Company Beta 
) 
*/ 
-1

Если вы используете PHP5 >= 5.5.0, вы можете попробовать array_column следующим образом:

$suppliers = array_column($suppliers, 'supplier_company','supplier_id'); 
print_r($suppliers); 
+0

Этот ответ повторяется: http://stackoverflow.com/a/28967734/2729937 –

-1

Вы можете использовать функцию each(), которая доступна, так как когда-либо, с конструктор list().

Вот пример:

$a=array(
    array(
     'a'=>0,'b'=>5 
    ), 
    array(
     'a'=>'no','b'=>'yes' 
    ) 
); 

while(list(,$tmp) = each($a))$new_array[$tmp['a']] = $tmp['b']; 

var_dump($new_array); 

Если выход:

array(2) { 
    [0]=> 
    int(5) 
    ["no"]=> 
    string(3) "yes" 
} 

Оба метода существуют с PHP4, таким образом, вы можете использовать их навсегда.

Если вы хотите выжать чуть-чуть больше производительности, вы можете использовать указатели:

while(list(,$tmp) = each(&$a))$new_array[$tmp['a']] = &$tmp['b']; 

Безопасно использовать unset($a) после!
Это быстрее, потому что вы просто назначаете указатель на адрес памяти, а не предоставляете новую копию массива.

+0

Упорядочить пояснение? –

1

Вы можете использовать anonymous functions:

$arr = array 
    (
    0 => array 
    (
     'supplier_id' => 3, 
     'supplier_company' => 'Company Alpha' 
    ), 

    1 => array 
    (
     'supplier_id' => 4, 
     'supplier_company' => 'Company Beta' 
    ) 

    ); 

    $names = array_map(function ($arg){return array($arg['supplier_id']=>$arg['supplier_company']);}, $arr); 
+1

Таким образом, он потеряет информацию «поставщик_ид». – charlesrockbass

+1

@charlesrockbass спасибо за указание. Я отредактировал свой ответ. – Whirlwind

1

array_column делает точно, что, как уже упоминалось.

Теперь, просто для удовольствия, вы можете попробовать что-то творческое, например, используя extract в вашей петле foreach. И ваша IDE, и ваши товарищи по команде будут скрипеть в вас.

foreach($inp as $supplier) { 
    extract($supplier); 

    // magic variables! 
    echo $supplier_id; 
    echo $supplier_company; 
} 
+1

Этот ответ уже был дан: http://stackoverflow.com/a/28967734/2729937 –

+0

Извините, я начал набирать свой ответ и пошел на тестирование, прежде чем читать другие комментарии. Я удалил дублированную часть. Остальная часть моего ответа довольно оригинальна;) – charlesrockbass

+2

Нет аргументов против этого. Несмотря на то, что это оригинал, требование заключалось в том, чтобы не использовать 'foreach'. Вы можете использовать 'foreach ($ inp as & $ поставщик)' как улучшение скорости (так как вместо копирования памяти вы будете использовать указатель). Я все равно его поддержал. –

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