Array( 0 => 'blabla',
1 => 'blabla',
2 => 'blblll' ) etc..
Есть ли способ изменить все числовые клавиши на "Имя" без цикла через массив (так что функция php)?
Array( 0 => 'blabla',
1 => 'blabla',
2 => 'blblll' ) etc..
Есть ли способ изменить все числовые клавиши на "Имя" без цикла через массив (так что функция php)?
Если у вас есть массив ключей, которые вы хотите использовать, используйте array_combine
Учитывая $keys = array ('a', 'b', 'c',...) и ваш массив, $list, сделайте следующее:
$list = array_combine($keys, array_values($list));
Список теперь будет массивом ('a' = > 'blabla 1',...) и т.д.
Вы должны использовать array_values
, чтобы извлекать только значения из массива, а не старые, числовые ключи.
Этот приятный и простой вид, но array_values создает целую копию массива, поэтому у вас могут возникнуть проблемы с пространством. Все, что мы делаем, это позволить php сделать цикл для нас, а не исключать цикл. У меня возникнет соблазн сделать что-то большее:
foreach ($list as $k => $v) {
unset ($list[$k]);
$new_key = *some logic here*
$list[$new_key] = $v;
}
Я не считаю это более эффективным, чем первый код, но он обеспечивает больший контроль и не будет иметь проблем с длиной массивов.
Нет, для начала не существует массива с элементами, использующими один и тот же ключ
$x =array();
$x['foo'] = 'bar' ;
$x['foo'] = 'baz' ; #replaces 'bar'
Во-вторых, если вы хотите просто префикс чисел, чтобы
$x[0] --> $x['foo_0']
Это неправдоподобно сделать без циклов. В настоящее время нет функций php для задачи "key-prefixing", а ближайшая вещь - "extract" , которая будет префикс цифровых клавиш до делая их переменными.
Самый простой способ:
function rekey( $input , $prefix ) {
$out = array();
foreach( $input as $i => $v ) {
if ( is_numeric( $i ) ) {
$out[$prefix . $i] = $v;
continue;
}
$out[$i] = $v;
}
return $out;
}
Кроме того, после чтения использования XMLWriter, я считаю, что вы плохо пишете XML.
<section>
<foo_0></foo_0>
<foo_1></foo_1>
<bar></bar>
<foo_2></foo_2>
</section>
Не является хорошим XML.
<section>
<foo></foo>
<foo></foo>
<bar></bar>
<foo></foo>
</section>
Является лучшим XML, потому что, когда intrepreted, дубликаты имен не имеют значения, потому что они все смещены так:
section => {
0 => [ foo , {} ]
1 => [ foo , {} ]
2 => [ bar , {} ]
3 => [ foo , {} ]
}
$prefix = '_';
$arr = array_combine(
array_map(function($v) use ($prefix){
return $prefix.$v;
}, array_keys($arr)),
array_values($arr)
);
Я добавил это для ответа на другой вопрос и выглядел соответствующим. Надеюсь, кто-то может помочь изменить значение ключей в массиве. Использует встроенные функции для php.
$inputArray = array('app_test' => 'test', 'app_two' => 'two');
/**
* Used to remap keys of an array by removing the prefix passed in
*
* Example:
* $inputArray = array('app_test' => 'test', 'app_two' => 'two');
* $keys = array_keys($inputArray);
* array_walk($keys, 'removePrefix', 'app_');
* $remappedArray = array_combine($keys, $inputArray);
*
* @param $value - key value to replace, should be from array_keys
* @param $omit - unused, needed for prefix call
* @param $prefix - prefix to string replace in keys
*/
function removePrefix(&$value, $omit, $prefix) {
$value = str_replace($prefix, '', $value);
}
// first get all the keys to remap
$keys = array_keys($inputArray);
// perform internal iteration with prefix passed into walk function for dynamic replace of key
array_walk($keys, 'removePrefix', 'app_');
// combine the rewritten keys and overwrite the originals
$remappedArray = array_combine($keys, $inputArray);
// see full output of comparison
var_dump($inputArray);
var_dump($remappedArray);
Вывод:
array(2) {
'attr_test' =>
string(4) "test"
'attr_two' =>
string(3) "two"
}
array(2) {
'test' =>
string(4) "test"
'two' =>
string(3) "two"
}
Решение, когда вы используете XMLWriter
(native в PHP 5.2.x
<), использует $xml->startElement('itemName');
, это заменит ключ массивов.
Я думаю, что он хочет:
$a = array(1=>'first_name', 2=>'last_name');
$a = array_flip($a);
$a['first_name'] = 3;
$a = array_flip($a);
print_r($a);
Использовать массив array_flip
в php
$array = array ( [1] => Sell [2] => Buy [3] => Rent [4] => Jobs )
print_r(array_flip($array));
Array ( [Sell] => 1 [Buy] => 2 [Rent] => 3 [Jobs] => 4 )
Я сделал это для массива объектов. Он в основном создает новые ключи в одном массиве и отключает старые ключи.
public function transform($key, $results)
{
foreach($results as $k=>$result)
{
if( property_exists($result, $key) )
{
$results[$result->$key] = $result;
unset($results[$k]);
}
}
return $results;
}
изменить имя массива "группа" на "дети".
<?php
echo json_encode($data);
function array_change_key_name( $orig, $new, &$array ) {
foreach ( $array as $k => $v ) {
$res[ $k === $orig ? $new : $k ] = ( (is_array($v)||is_object($v)) ? array_change_key_name( $orig, $new, $v ) : $v );
}
return $res;
}
echo '<br>=====change "group" to "children"=====<br>';
$new = array_change_key_name("group" ,"children" , $data);
echo json_encode($new);
?>
результат:
{"benchmark":[{"idText":"USGCB-Windows-7","title":"USGCB: Guidance for Securing Microsoft Windows 7 Systems for IT Professional","profile":[{"idText":"united_states_government_configuration_baseline_version_1.2.0.0","title":"United States Government Configuration Baseline 1.2.0.0","group":[{"idText":"security_components_overview","title":"Windows 7 Security Components Overview","group":[{"idText":"new_features","title":"New Features in Windows 7"}]},{"idText":"usgcb_security_settings","title":"USGCB Security Settings","group":[{"idText":"account_policies_group","title":"Account Policies group"}]}]}]}]}
=====change "group" to "children"=====
{"benchmark":[{"idText":"USGCB-Windows-7","title":"USGCB: Guidance for Securing Microsoft Windows 7 Systems for IT Professional","profile":[{"idText":"united_states_government_configuration_baseline_version_1.2.0.0","title":"United States Government Configuration Baseline 1.2.0.0","children":[{"idText":"security_components_overview","title":"Windows 7 Security Components Overview","children":[{"idText":"new_features","title":"New Features in Windows 7"}]},{"idText":"usgcb_security_settings","title":"USGCB Security Settings","children":[{"idText":"account_policies_group","title":"Account Policies group"}]}]}]}]}
<?php
$array[$new_key] = $array[$old_key];
unset($array[$old_key]);
?>
Чтобы иметь тот же ключ, я думаю, что они должны быть в отдельных вложенных массивах.
for ($i = 0; $i < count($array); $i++) {
$newArray[] = ['name' => $array[$i]];
};
Вывод:
0 => array:1 ["name" => "blabla"]
1 => array:1 ["name" => "blabla"]
2 => array:1 ["name" => "blblll"]
Вы можете создать новый массив, содержащий этот массив, поэтому:
<?php
$array = array();
$array['name'] = $oldArray;
?>