python의 zip과 같은 php 기능이 있나요?
Python은 기능이 좋다.PHP에 상당하는 것이 있습니까?
모든 어레이의 길이가 같으면 다음과 같이 사용할 수 있습니다.null
첫 번째 인수로.
array_map(null, $a, $b, $c, ...);
반환되는 결과가 최단 배열의 길이인 python과 달리 일부 배열이 짧은 배열의 길이인 경우 null로 가장 긴 배열까지 채워집니다.
array_combine
가까이 와.
그렇지 않으면 직접 코딩하는 것보다 더 좋은 것은 없습니다.
function array_zip($a1, $a2) {
for($i = 0; $i < min(length($a1), length($a2)); $i++) {
$out[$i] = [$a1[$i], $a2[$i]];
}
return $out;
}
이 함수를 사용하여 Python의 어레이와 유사한 어레이를 만듭니다.zip
:
function zip() {
$args = func_get_args();
$zipped = array();
$n = count($args);
for ($i=0; $i<$n; ++$i) {
reset($args[$i]);
}
while ($n) {
$tmp = array();
for ($i=0; $i<$n; ++$i) {
if (key($args[$i]) === null) {
break 2;
}
$tmp[] = current($args[$i]);
next($args[$i]);
}
$zipped[] = $tmp;
}
return $zipped;
}
이 기능은 원하는 수만큼 많은 아이템을 사용하여 전달할 수 있습니다.
이것은 Python의 기능과 똑같이 동작하며 PHP < 5.3과도 호환됩니다.
function zip() {
$params = func_get_args();
if (count($params) === 1){ // this case could be probably cleaner
// single iterable passed
$result = array();
foreach ($params[0] as $item){
$result[] = array($item);
};
return $result;
};
$result = call_user_func_array('array_map',array_merge(array(null),$params));
$length = min(array_map('count', $params));
return array_slice($result, 0, $length);
};
Python의 방식으로 어레이를 병합합니다.zip()
는 최단 배열 끝에 도달한 후에 발견된 요소를 반환하거나 반환하지 않습니다.
다음 항목:
zip(array(1,2,3,4,5),array('a','b'));
는 다음과 같은 결과를 나타냅니다.
array(array(1,'a'), array(2,'b'))
및 다음과 같습니다.
zip(array(1,2,3,4,5),array('a','b'),array('x','y','z'));
는 다음과 같은 결과를 나타냅니다.
array(array(1,'a','x'), array(2,'b','y'))
EDIT: 단일 인수 수신 지원 추가(array_map
다른 행동을 할 수 있습니다.고마워요 조시아).
솔루션
솔루션 매칭zip()
매우 밀접하게 PHP 기능을 동시에 사용하는 것은 다음과 같습니다.
array_slice(
array_map(null, $a, $b, $c), // zips values
0, // begins selection before first element
min(array_map('count', array($a, $b, $c))) // ends after shortest ends
);
간단하지 않은 이유array_map(null, $a, $b, $c)
전화할 수 있나요?
이미 코멘트에서 언급했듯이, 저는 nabnabit의 솔루션을 선호하는 경향이 있습니다.array_map(null, $a, $b, ...)
(상기 참조)는 약간 변경되어 있습니다.
일반적으로 다음과 같습니다.
array_map(null, $a, $b, $c);
Python의 대응책:
itertools.izip_longest(a, b, c, fillvalue=None)
(에 포함)list()
(반복기 대신 목록을 원하는 경우)이 때문에, 모방하는 요건은 정확하게 들어맞지 않습니다.zip()
의 동작(모든 어레이의 길이가 동일하지 않은 경우)
zip과 다른 Python 함수는 비표준 PHP 라이브러리에서 찾을 수 있습니다.오퍼레이터 모듈 및 디폴트 어레이 포함.
use function nspl\a\zip;
$pairs = zip([1, 2, 3], ['a', 'b', 'c']);
나는 글을 썼다.zip()
enum의 PHP 구현을 위한 함수입니다.
코드가 Python 스타일로 수정되었습니다.zip()
루비 스타일도 있어요.그 차이는 코멘트에 설명되어 있습니다.
/*
* This is a Python/Ruby style zip()
*
* zip(array $a1, array $a2, ... array $an, [bool $python=true])
*
* The last argument is an optional bool that determines the how the function
* handles when the array arguments are different in length
*
* By default, it does it the Python way, that is, the returned array will
* be truncated to the length of the shortest argument
*
* If set to FALSE, it does it the Ruby way, and NULL values are used to
* fill the undefined entries
*
*/
function zip() {
$args = func_get_args();
$ruby = array_pop($args);
if (is_array($ruby))
$args[] = $ruby;
$counts = array_map('count', $args);
$count = ($ruby) ? min($counts) : max($counts);
$zipped = array();
for ($i = 0; $i < $count; $i++) {
for ($j = 0; $j < count($args); $j++) {
$val = (isset($args[$j][$i])) ? $args[$j][$i] : null;
$zipped[$i][$j] = $val;
}
}
return $zipped;
}
예를 들어:
$pythonzip = zip(array(1,2,3), array(4,5), array(6,7,8));
$rubyzip = zip(array(1,2,3), array(4,5), array(6,7,8), false);
echo '<pre>';
print_r($pythonzip);
print_r($rubyzip);
echo '<pre>';
// create
$a = array("a", "c", "e", "g", "h", "i");
$b = array("b", "d", "f");
$zip_array = array();
// get length of the longest array
$count = count(max($a, $b));
// zip arrays
for($n=0;$n<$count;$n++){
if (array_key_exists($n,$a)){
$zip_array[] = $a[$n];
}
if (array_key_exists($n,$b)){
$zip_array[] = $b[$n];
}
}
// test result
echo '<pre>'; print_r($zip_array); echo '<pre>';
function zip() {
$zip = [];
$arrays = func_get_args();
if ($arrays) {
$count = min(array_map('count', $arrays));
for ($i = 0; $i < $count; $i++) {
foreach ($arrays as $array) {
$zip[$i][] = $array[$i];
}
}
}
return $zip;
}
이것은 Python에서와 같이 동작합니다.
function zip(...$arrays) {
return array_filter(
array_map(null, ...(count($arrays) > 1 ? $arrays : array_merge($arrays, [[]]))),
fn($z) => count($z) === count(array_filter($z)) || count($arrays) === 1
);
}
/**
* Takes an arbitrary number of arrays and "zips" them together into a single
* array, taking one value from each array and putting them into a sub-array,
* before moving onto the next.
*
* If arrays are uneven lengths, will stop at the length of the shortest array.
*/
function array_zip(...$arrays) {
$result = [];
$args = array_map('array_values',$arrays);
$min = min(array_map('count',$args));
for($i=0; $i<$min; ++$i) {
$result[$i] = [];
foreach($args as $j=>$arr) {
$result[$i][$j] = $arr[$i];
}
}
return $result;
}
사용방법:
print_r(array_zip(['a','b','c'],[1,2,3],['x','y']));
출력:
Array
(
[0] => Array
(
[0] => a
[1] => 1
[2] => x
)
[1] => Array
(
[0] => b
[1] => 2
[2] => y
)
)
단일 어레이를 에 전달하는 문제를 해결하려면map_array
, 당신은 이 함수를 통과할 수 있습니다...그러나 당신은 통과할 수 없습니다."array"
실제 기능이 아니라 내장된 기능이기 때문입니다.
function make_array() { return func_get_args(); }
array_combine과 관련이 있다고 생각되는 사용자 전용:
function array_zip($a, $b)
{
$b = array_combine(
$a,
$b
);
$a = array_combine(
$a,
$a
);
return array_values(array_merge_recursive($a,$b));
}
수 있다array_map
★★★★
$arr1 = ['get', 'method'];
$arr2 = ['post'];
$ret = array_map(null, $arr1, $arr2);
출력:
[['get', 'method'], ['post', null]]
언급URL : https://stackoverflow.com/questions/2815162/is-there-a-php-function-like-pythons-zip
'source' 카테고리의 다른 글
JavaScript 개체의 길이 (0) | 2022.12.08 |
---|---|
PDO 준비 스테이트먼트:예상된 결과 대신 NULL 가져오기 (0) | 2022.12.08 |
Galera 클러스터에서 쓰기 속도를 높이는 방법은 무엇입니까?최대 축척을 DB 프록시로 사용 (0) | 2022.12.08 |
vs 코드에서 제가 직면한 오류를 해결하는 데 도움을 주실 수 있나요? (0) | 2022.12.08 |
JavaScript에서 문자열 매칭을 위한 스위치 문 (0) | 2022.12.08 |