2016-07-04 3 views
0

У меня есть массив ($myArray), которую я хочу изменить:PHP изменить массив с array_search и array_column

array(2) { 
    [0]=> 
    array(2) { 
    [0]=> 
    string(3) "100" 
    [1]=> 
    string(9) "fancyLink" 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    string(3) "200" 
    [1]=> 
    string(10) "fanyLink2" 
    } 
} 

У меня есть две POST массивы, которые имеют следующую структуру. Первый массив $number:

array(2) { 
    [0]=> 
    string(3) "100" 
    [1]=> 
    string(3) "200" 
} 

и второй массив $links:

array(2) { 
    [0]=> 
    string(12) "newFancyLink" 
    [1]=> 
    string(13) "newFancyLink2" 
} 

Чтобы изменить $myArray для того, чтобы заменить одну или несколько ссылок по $number -value Я хотел использовать следующую строку

for($i = 0; $i < 2; $i++) 
{ 
    $myArray[array_search($number[$i], array_column($myArray, "0"))][1] = $links[$i]; 
} 

Но это не сработает, оно устанавливает обе ссылки 100 и 200 к тому же значению (вторая ссылка)

Я написал этот код, который работает, но я хотел бы использовать другую линию вместо или, по крайней мере, сравнить Perfomance его

for($i = 0; $i < 2; $i++) 
{ 
    for($j = 0; $j < 2; $j++) 
    { 
     if($myArray[$j][0] == $number[$i]) 
     { 
      $myArray[$j][1] = $links[$i]; 
     } 
    } 
} 

Использование $number -значение в качестве ключа сделало бы это намного проще, но это не вариант для меня.

EDIT после решения

В случае, если кто-нибудь хочет знать, обе версии идентичны alost быстро. 10000 работает каждый результат в этом время выполнения:

0.10158801078796 
0.10160994529724 

ответ

1

Возможно array_column($myArray, "0") должно быть array_column($myArray, 0) вместо этого (так как это не ассоциативный массив)? Таким образом, это работает для меня.

Из PHP-manual

array array_column (array $input , mixed $column_key [, mixed $index_key = null ]) 

COLUMN_KEY

Столбец значений для возврата. Это значение может быть целым ключом столбца, который вы хотите получить, или может быть именем строкового ключа для ассоциативного массива или имени свойства. Также может быть NULL возвращать полные массивы или объекты (это полезно вместе с index_key для переиндекса массива).

+0

Хм, потому что PHP имеет только ассоциативные массивы и числовые массивы, притворяющиеся только числовыми, я думал, что это не имеет значения, см. этот пост: http : //stackoverflow.com/questions/37854038/php-numeric-array-order Но спасибо, я рассмотрю его – JRsz

+0

Я проверил, ваш ответ работает. PHP иногда странный, по крайней мере для меня: D Я принял ваш ответ, поскольку он решил мою конкретную проблему, спасибо :) – JRsz

1

Раствор с помощью array_map и array_walk функции:

$numLinks = array_map(null, $number, $links); 
// you may also iterate via a regular 'foreach' loop 
array_walk($myArray, function(&$v, $k) use($numLinks){ 
    if ($v[0] == $numLinks[$k][0]) $v[1] = $numLinks[$k][1]; 
}); 

print_r($myArray); 

Выход:

Array 
(
    [0] => Array 
     (
      [0] => 100 
      [1] => newFancyLink 
     ) 
    [1] => Array 
     (
      [0] => 200 
      [1] => newFancyLink2 
     ) 
) 
+0

Хм, это может сработать, но у меня уже есть рабочий код, и просто интересно, почему моя первая попытка не работает, потому что, насколько я понял, это должно ... – JRsz

+0

* Это может работать * - Это отлично работает , Что касается вашего кода, второй аргумент функции 'array_column' - * это значение может быть целым ключом столбца, который вы хотите получить, или может быть именем строкового ключа для ассоциативного массива или имени свойства *.Но вы указали целочисленный ключ как строку – RomanPerekhrest

+0

Hm, потому что PHP имеет только ассоциативные массивы и числовые массивы, притворяющиеся только числовыми, я думал, что это не имеет значения, см. Этот пост: stackoverflow.com/questions/37854038/php-numeric- массив-порядок. Но спасибо, я посмотрю на него :) PHP иногда странный ... – JRsz

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